<0> はじめに (標準 Pascal 範囲内での Delphi 入門)〔裏〕

# 0. はじめに

## 0.1. Pascal プログラムの概要

#### ・uses 句の由来

> Delphi にはソース分割のための uses 句があるため、

この拡張は **Ada** の機能を参考に **UCSD Pascal** が導入したようです。

#### ・節入れ替えの由来
> Delphi では実行部以外なら節を入れ替えても大丈夫ですし、

この拡張は **Apple LISA Pascal** 由来のようですが、他の Pascal にも類似の拡張があるようです。

**See also**

 - [UCSD Pascal を触るためだけの UCSD p-System 操作ガイド (Qiita)](https://qiita.com/ht_deko/items/50c0cb0fd3cbafc1f8e1)
 - [<2> Clascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/770f2db98c9cf3e8ef7b)

### (0.1.1.) unit と uses

#### ・宣言部 (interface) と実現部 (implementation)
C 言語で言う所のヘッダファイル (\*.h) が宣言部、ソースファイル (\*.c) が実現部に相当します。

#### ・finalization
終了処理部 **finalization** は Delphi 2 で導入されました。Delphi 1 には同等の処理を行うための `ExitProc()` と `AddExitProc()` がありました。


#### ・to begin do / to end do (拡張 Pascal)

**拡張 Pascal** には **initialization** / **finalization** 同様の構造として、**to begin do** / **to end do** があります。

```pascal
unit ユニット識別子;

// 宣言部
interface

  { 宣言部のコード }

// 実現部
implementation

  { 実現部のコード }

// 初期化文 (オプション)
to begin do
begin
  { 初期化のコード }
end;

// 終了処理文 (オプション)
to end do
begin
  { 終了処理のコード }
end;

end.             
```

共に**文**として定義されているようです。

```
ユニット初期化文 =
  to begin do 文 ";".
ユニット終了処理文 =
  to end do 文 ";".
```

#### ・暗黙の uses
**uses** には暗黙的に `System` ユニットと `SysInit` ユニットが含まれています。

**Modula-2** にも疑似モジュール `SYSTEM` がありました。

#### ・in を伴う uses
プロジェクトファイル (\*.dpr) の **uses** 句には **in** 指令を伴ってユニットが記述されている事があります。

```Project1.dpr
program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
```

これは ユニット (`Unit1`) がプロジェクト (`Project1`) に含まれる事を意味し、ソースファイル (`Unit1.pas`) は IDE の管理下に置かれる事になります。

### (0.1.1.1.) Propagated Uses (Uses Propagation / Unit Propagation)

#### ・Propagated Uses

Mac 系の Pascal には **Propagated Uses** または **Uses Propagation** と呼ばれる機能があり、これをオンにするとユニットオブジェクトのスコープが拡張され、間接的に **uses** されたユニットのルーチン等を使用できるようになります。

```unitA.pas
unit unitA;

uses
  unitB;
...
function FuncA: Integer;
```

```unitB.pas
unit unitB;

uses
  unitC;

function FuncB: Integer;
...
```

```unitC.pas
unit unitC;

function FuncC: Integer;
...
```

unitA のスコープでは、自身で定義されている `FuncA()` と unitB の `FuncB()` が使えますが、間接的に **uses** されている unitC の `FuncC()` も使えるのが **Propagated Uses** です。

#### ・Symantec THINK Pascal の Propagated Uses
[コンパイラオプション] で "USES Extensions" にチェックを入れると Propagated Uses が有効になります [^1] [^2]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/5b91410c-ee68-9285-f4ad-d23179377819.png)

#### ・Metroweaks CodeWarrior Pascal の Uses Propagation
[Pascal Language 設定パネル] で "Uses Propagation" にチェックを入れるか、プラグマ `$pragma usespropagation on` で Uses Propagation が有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a3eab04e-8217-3bdf-f92d-09c45c177b0c.png)
**See also**

 - [MACPAS mode (freepascal.org)](https://www.freepascal.org/docs-html/prog/progse76.html)
 - [5.1 GPC options besides those of GCC. (gnu-pascal.org)](http://www.gnu-pascal.org/gpc/GPC-Command-Line-Options.html)
 - [<3> Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/cd245180363e1911afa7)


### (0.1.2.) インクルードファイル
インクルードファイルの当初の目的はメモリ不足でエディタに収まらないソースファイルを分割して編集するためでした。

分割コンパイルのための仕組みではないので、コンパイル時に毎回読み込まれます。

### (0.1.3.) パッケージとライブラリ

#### (0.1.3.1.) パッケージ

#### (0.1.3.2.) ライブラリ

## 0.2. 構文図

## 0.3. 拡張バッカス・ナウア記法 (EBNF)

## 0.4. 有効範囲 (スコープ)

# 索引
[:ramen:](https://qiita.com/ht_deko/items/afb3c008a83a20792169) [ [↑ 目次へ](https://qiita.com/ht_deko/items/46fcdbb11cdc58872160) ] [ [→ 1. 記法: トークンと区切り文字〔裏〕](https://qiita.com/ht_deko/items/bb5d4eaf532e8c217cdb) ]

[^1]: ノメモバスターズを入れていないので `ﾔ` とか `ﾕ` が表示されています。本来の表示は `‘USES’ Extensions` です。
[^2]: "USES Extensions" のもう一つの拡張は実装部 (**Implementation**) での **uses** です。