This post is Private. Only a writer or those who know its URL can access this post.

Improve article
RevisionsShow article in Markdown
Report article
Help us understand the problem. What is going on with this article?

<11> 手続きと関数 (標準 Pascal 範囲内での Delphi 入門)〔裏〕

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.) 手続き型定数とグローバル手続き型変数の初期化

索引

:ramen: [ ← 10. ポインタ型〔裏〕 ] [ ↑ 目次へ ] [ → 12. テキストファイルの入出力〔裏〕 ]


  1. 『ISO/IEC 7185:1990』および『JIS X 3008:1994』より引用。 

ht_deko
とある熊本の障害復旧(トラブルシューター)
https://ht-deko.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away