LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

Turbo Pascal 3.0.x の Pascal

はじめに

Turbo Pascal 3.0.x の Pascal について調べてみました。
image.png
なんとなく調べたくなったのです。

Turbo Pascal は Pascal

何を当たり前の事を言っているのかとお思いでしょうが、Delphi に比べると遥かに Pascal です。しかしながら標準 Pascal とも異なっています。

Turbo Pascal の文法に関してはマニュアル等の書籍があればそれが一番いいのですが、標準 Pascal や Delphi のドキュメントからもある程度知る事ができます。

See also:

■ 標準 Pascal と Turbo Pascal の違い

標準 Pascal 範囲内での差異は次の通りです。

○ New() と Dispose() の二番目の書式

Turbo Pascal は New() と Dispose() の二番目の書式 に対応していません。

See also:

○ 再帰 (CP/M-80 版のみ)

「ルーチン内のローカル変数を再帰呼び出しの var パラメータに渡してはならない」という制限があります。そもそもそんな事やらないと思うのですが...。

RECUR.PAS
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 が返ります。
image.png
これを CP/M-80 版の Turbo Pascal で実行してみると...
image.png
5 が返ってきます。
image.png
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:

○ 入出力ルーチン

手続き

Procedures
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:

○ 算術ルーチン

関数

Functions
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;

○ 順序ルーチン

関数

Functions
Odd(I: Integer): Boolean;
Pred(X: scalar): scalar;
Succ(X: scalar): scalar;

※ scalar = ここで言うスカラ (型) とは順序型の事です。

See also:

○ 変換ルーチン

関数

Functions
Chr(I: Integer): Char;
Ord(X: scalar): Integer;
Round(R: Real): Integer;
Trunc(R: Real): Integer;

○ 文字列ルーチン

手続き

Procedures
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);

関数

Functions
Concat(S1, S2, ... , Sn: string): string;
Copy(S: string; Pos, Len: Integer): string;
Length(S: string): Integer;
Pos(Pattern, Source: string): Integer;

○ ファイル操作ルーチン

手続き

Procedures
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);

関数

Functions
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:

○ ヒープ制御ルーチン

手続き

Procedures
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);

関数

Functions
MaxAvail: Integer;
MemAvail: Integer;
Ord(P: pointer): Integer;
Ptr(I: Integer): pointer;

○ 画面関連ルーチン

手続き

Procedures
CrtExit;
Crtlnit;
ClrEol;
ClrScr;
Delline;
GotoXY(X, Y: Integer);
Insline;
LowVideo;
NormVideo;

See also:

○ その他ルーチン

手続き

Procedures
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;

関数

Functions
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:

おわりに

Turbo Pascal 3.0.x くらいの規模だと覚えるのもそんなに難しくないですよね。

言い忘れましたが、Turbo Pascal 3.0.x では uses を使ったモジュール化はできませんが 1、インクルードファイルを使ってファイル分割する事は可能です。

See Also:


  1. uses は Turbo Pascal 4.0 以降で利用可能です。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2