はじめに
Turbo Pascal 3.0.x の Pascal について調べてみました。
なんとなく調べたくなったのです。
Turbo Pascal は Pascal
何を当たり前の事を言っているのかとお思いでしょうが、Delphi に比べると遥かに Pascal です。しかしながら標準 Pascal とも異なっています。
Turbo Pascal の文法に関してはマニュアル等の書籍があればそれが一番いいのですが、標準 Pascal や Delphi のドキュメントからもある程度知る事ができます。
See also:
- 標準 Pascal の規格票と解説書を読んでみる (Qiita)
- 標準 Pascal 範囲内での Delphi 入門 (Qiita)
- Delphi と標準 Pascal の比較 (Qiita)
- Delphi 言語ガイド (Embarcadero)
■ 標準 Pascal と Turbo Pascal の違い
標準 Pascal 範囲内での差異は次の通りです。
○ New() と Dispose() の二番目の書式
Turbo Pascal は New() と Dispose() の二番目の書式
に対応していません。
See also:
○ 再帰 (CP/M-80 版のみ)
「ルーチン内のローカル変数を再帰呼び出しの var パラメータに渡してはならない」という制限があります。そもそもそんな事やらないと思うのですが...。
program RECUR(Input, Output);
function Summation(var num: Integer): Integer;
var
v: Integer;
begin
if num = 1 then
Summation := 1
else
begin
v := num;
num := num - 1;
Summation := Summation(num) + v;
end;
end; { Summation }
function SubProgram: Integer;
var
v: Integer;
begin
v := 3;
SubProgram := Summation(v);
end; { SubProg }
begin
Writeln(SubProgram);
end.
このプログラムは FreePascal Wiki にある再帰のサンプルを改変したものです。標準 Pascal で実行してみると、確かに 6
が返ります。
これを CP/M-80 版の Turbo Pascal で実行してみると...
5
が返ってきます。
MS-DOS 版では 6
が返ります。
○ Get() と Put()
Turbo Pascal には Get()
と Put()
、そしてバッファ変数
が使えません。これはファイルの 1 文字先読み機能がない事を意味します。
See also:
○ GOTO ステートメント
Turbo Pascal の goto ステートメントは手続き内 goto (intraprocedural gotos) であり、手続き/関数の外側へジャンプする事はできません。
See also:
○ Page()
Page()
手続きは実装されていません。
See also:
○ パックされた変数
PACKED は文法上エラーになりませんが、Turbo Pascal では意味を持ちません。このため、Pack()
と Unpack()
は実装されていません。
See also:
○ 手続きパラメータ / 関数パラメータ
手続きや関数をパラメータとして渡す事はできません。
See also:
■ ルーチン
Turbo Pascal で使えるルーチンです。標準 Pascal で使えるルーチンも含まれています。Delphi で使えるルーチンもあるので、ある程度の使い方は Embarcadero の DocWiki を参照して知る事ができます。
See also:
○ 入出力ルーチン
手続き
Read(var F: file of type; var V: type);
Read(var F: text; var I: Integer);
Read(var F: text; var R: Real);
Read(var F: text; var C: Char);
Read(var F: text; var S: string);
Readln(var F: text);
Write(var F: file of type; var V: type);
Write(var F: text; I: Integer);
Write(var F: text; R: Real);
Write(var F: text; B: Boolean);
Write(var F: text; C: Char);
Write(var F: text; S: string);
Writeln(var F: text);
See also:
○ 算術ルーチン
関数
Abs(I: Integer): Integer;
Abs(R: Real): Real;
ArcTan(R: Real): Real;
Cos(R: Real): Real;
Exp(R: Real): Real;
Frac(R: Real: Real;
Int(R: Real): Real;
Ln(R: Real): Real;
Sin(R: Real): Real;
Sqr(I: Integer): Integer;
Sqr(R: Real): Real;
Sqrt(R: Real): Real;
○ 順序ルーチン
関数
Odd(I: Integer): Boolean;
Pred(X: scalar): scalar;
Succ(X: scalar): scalar;
※ scalar = ここで言うスカラ (型) とは順序型の事です。
See also:
○ 変換ルーチン
関数
Chr(I: Integer): Char;
Ord(X: scalar): Integer;
Round(R: Real): Integer;
Trunc(R: Real): Integer;
○ 文字列ルーチン
手続き
Delete(var S: string; Pos, Len: Integer);
Insert(S: string; var D: string; Pas: Integer);
Str(I: Integer; var S: string);
Str(R: Real; var S: string);
Val(S: string; var R: Real; var P: Integer);
Val(S: string; var I, P: Integer);
関数
Concat(S1, S2, ... , Sn: string): string;
Copy(S: string; Pos, Len: Integer): string;
Length(S: string): Integer;
Pos(Pattern, Source: string): Integer;
○ ファイル操作ルーチン
手続き
Append(var F: file; Name: string);
Assign(var F: file; Name: string);
BlockRead(var F: file; var Dest: Type; Num: Integer);
BlockWrite(var F: file; var Dest: Type; Num: Integer);
Chain(var F: file);
Close(var F: file);
Erase(var F: file);
Execute(var F: file);
Rename(var F: file; Name: string);
Reset(var F: file);
Rewrite(var F: file);
Seek(var F: file of type; Pos: Integer);
関数
Eof(var F: file): Boolean;
Eoln(var F: Text): Boolean;
FilePos(var F: file of type): Integer;
FilePos(var F: file): Integer;
FileSize(var F: file of type): Integer;
FileSize(var F: file): Integer;
SeekEof(var F: file): Boolean;
SeekEoln(var F: Text): Boolean;
See also:
○ ヒープ制御ルーチン
手続き
Dispose(var P: pointer);
FreeMem(var P: pointer, I: Integer);
GetMem(var P: pointer, I: Integer);
Mark(var P: pointer);
New(var P: pointer);
Release(var P: pointer);
関数
MaxAvail: Integer;
MemAvail: Integer;
Ord(P: pointer): Integer;
Ptr(I: Integer): pointer;
○ 画面関連ルーチン
手続き
CrtExit;
Crtlnit;
ClrEol;
ClrScr;
Delline;
GotoXY(X, Y: Integer);
Insline;
LowVideo;
NormVideo;
See also:
○ その他ルーチン
手続き
Bdos(Func, Param: Integer);
Bios(Func, Param: Integer);
Delay(mS: Integer);
FillChar(var Dest, Length: Integer; Data: Char);
FiIIChar(var Dest, Length: Integer; Data: Byte);
Halt;
Move(var Source, Dest: type; Length: Integer);
Randomize;
関数
Addr(var Variable): Integer;
Addr(<function identifier>): Integer;
Addr(<procedure identifier>): Integer;
Bdos(Func, Param: Integer): Byte;
BdosHL(Func, Param: Integer): Integer;
Bios(Func, Param: Integer): Byte;
BiosHL(Func, Param: Integer): Integer;
Hi(I: Integer): Integer;
IOresult: Boolean;
KeyPressed: Boolean;
Lo(I: Integer): Integer;
ParamCount: Integer;
ParamStr(N: Integer): string;
Random(Range: Integer): Integer;
Random: Real;
SizeOf(var Variable): Integer;
SizeOf(<type identifier>): Integer;
Swap(I: Integer}: Integer;
UpCase(Ch: Char): Char;
See Also:
- Hardware dependent information - Turbo Pascal 3.0.x のスクリーン設定 (Qiita)
- Borland Turbo Pascal - RunCPM (Z80 CP/M 2.2 エミュレータ) (ht-deko.com)
おわりに
Turbo Pascal 3.0.x くらいの規模だと覚えるのもそんなに難しくないですよね。
言い忘れましたが、Turbo Pascal 3.0.x では uses を使ったモジュール化はできませんが 1、インクルードファイルを使ってファイル分割する事は可能です。
See Also:
-
uses は Turbo Pascal 4.0 以降で利用可能です。 ↩