11. 手続きと関数
11.1. 手続き (Procedures)
11.1.1. パラメータリスト (パラメータ並び / Parameter list)
JIS X 3008:1994 ではパラメータの事を 引数
としていますが、元となった規格の ISO/IEC 7185:1990 では Parameter
となっています。
Pascal | 他言語 | 用語 | |
---|---|---|---|
定義で渡されるもの | 仮パラメータ | 仮引数 | パラメータ |
呼び出しで渡されるもの | 実パラメータ | 実引数 | 引数 |
次の x
は Pascal では 仮パラメータ
です。他言語では 仮引数
と呼ばれます。
function f(x: Integegr): Integer;
次の 2
は Pascal では 実パラメータ
です。他言語では 実引数
と呼ばれます。
v := f(2);
仮 (formal-)
とか 実 (actual-)
という言葉を使わない場合、前者が パラメータ
で、後者が 引数
となります。上のコードだと「パラメータ x
に渡された、引数 2
」という事になります。
See also:
11.1.2. 整合配列パラメータ (Conformant array parameters)
ANSI Pascal は 標準 Pascal (ISO 7185:1983) 水準 0 相当の規格です。
整合配列パラメータは名前等価の考え方から外れている気がして、個人的には好きではありません。
See also:
11.1.3. 再帰手続き (Recursive procedures)
11.1.4. 手続きパラメータ (Procedural parameters)
ISO/IEC 7185 および JIS X 3008 には「標準手続きを実手続きパラメータとして渡す事は出来ない」とはどこにも書かれていないように思えるのですが、
6.6.3.4 Procedural parameters The actual-parameter (中略) shall be a procedure-identifier that has a defining-point contained by the program-block.
6.6.3.4 手続き引数 実引数 (中略) は,手続き名でなければならない。この手続き名の定義位置は,プログラムブロックに含まれていなければならない。
とあります 1。標準手続きはプログラムブロック内で定義されていないため、標準手続きを実手続きパラメータとして渡す事はできません。
(11.1.5.) オープン配列パラメータ (Open Array Parameters)
オープン配列パラメータは Modula-2 由来です。High() 関数も Modula-2 由来ですが、Modula-2 には LOW() 関数はありません。Modula-2 のオープン配列パラメータの配列は常に 0 から始まるため LOW() は不要なのです。
See also:
(11.1.6.) 型可変オープン配列パラメータ (Variant Open Array Parameters)
(11.1.7.) オープン配列コンストラクタ (Open Array Constructors)
(11.1.8.) デフォルトパラメータ (Default Parameters)
(11.1.9.) ルーチンのオーバーロード (Overloading Routines)
(11.1.10.) オープン文字列パラメータ (Open String Parameters)
(11.1.11.) Exit() 手続き
A.V. エイホらの『データ構造とアルゴリズム』で使われている疑似言語 Super Pascal では、同様の機能を持つ return() 文が使える事になっています。
Exit() 手続きは Modula-2 にもありますが、意味合いが異なります。
Pascal | Modula-2 | |
---|---|---|
Exit() / EXIT | ルーチンから抜ける | LOOP~END を抜ける |
RETURN() | N/A | ルーチンから抜ける |
See also:
(11.1.12.) Halt() 手続き
Halt() 手続きは Modula-2 にもありますが、Modula-2 の HALT() にはパラメータがありません。
See also:
11.2. 関数 (Functions)
結果型 (Result Type)
結果 (Result)
パラメータを受け取る Exit() 手続き自体は UCSD Pascal でも実装されていましたが、受け取るパラメータはルーチンでした。逆にパラメータのない Exit() はありませんでした。
function Add(A, B: integer): Integer;
begin
Add := A + B;
Exit(Add);
end;
拡張 Pascal では結果を保持する変数名を指定できます。ユーザー定義の Result 変数のようなものです。
function Add(A, B: integer) = i: Integer;
begin
i := A + B;
end;
See also:
関数呼び出し (Function Call)
再帰関数 (Recursive functions)
11.2.1. 関数パラメータ (Functional parameters)
ISO/IEC 7185 および JIS X 3008 には「標準関数を実関数パラメータとして渡す事は出来ない」とはどこにも書かれていないように思えるのですが、
6.6.3.5 Functional parameters The actual-parameter (中略) shall be a function-identifier that has a defining-point contained by the program-block.
6.6.3.5. 関数引数 実引数 (中略) は,関数名でなければならない。この関数の定義位置は,プログラムブロックに含まれていなければならない。
とあります 1。標準関数はプログラムブロック内で定義されていないため、標準関数を実関数パラメータとして渡す事はできません。
名前等価の考え方で行くと Delphi の手続き型を使ったやり方の方がスマートに思えます。
11.2.2. 副作用 (Side effect)
11.3. 前方宣言 (Forward declaration)
(11.4.) 手続き型 (Procedural Types)
手続き型 (Procedural Types) は Modula-2 の手続き型 (Procedure Type) 由来だと思われます。
(11.4.1.) 手続き型定数とグローバル手続き型変数の初期化
索引
[ ← 10. ポインタ型〔裏〕 ] [ ↑ 目次へ ] [ → 12. テキストファイルの入出力〔裏〕 ]
-
『ISO/IEC 7185:1990』および『JIS X 3008:1994』より引用。 ↩