TL/1 の変なところ (関数と手続き)

プログラミング言語 TL/1 では関数と手続きに区別がある。 要は値を返さないのが手続きなのだが、手続きの呼び出しは式ではなく文となることが特徴である。 また、プログラムは文の集合であるとされているので、構文の中で式が許されているところでしか式を書けないし、式の一種 (あるいは一部) である関数呼出しも書けない。

例として、一文字入力のための組込関数 GET を取り上げることにしよう。 問答無用で一文字を読み飛ばしたいなら返却値が不要であるからこんな風に書きたくなるかもしれない。

BEGIN
  GET(0) % 引数として渡す値は装置番号でありゼロはコンソールを意味する
END

しかし、これは構文違反である。

あえてやりたいなら無意味なダミーの変数を使う。

VAR A
BEGIN
  A := GET(0)       % 後で使われないダミー変数を使った代入文
  IF GET(0) THEN {} % 真であっても何もしない IF 文
END

GET を覆って手続きにしてしまうという方法もある。 ここでは SKIP という名前の手続きを作ってみよう。

PROC SKIP  % これから定義する手続きの宣言

BEGIN      % メインプログラム
  SKIP(0)  % SKIP は手続きなので文として直接書くことが出来る
END

SKIP(X)    % 手続きの定義
BEGIN
  IF GET(X) THEN {}
END

Pascal のように手続きと関数に区別がある言語は有るので、これらは TL/1 に特有の事情というわけではない。 とは言っても、返却値がないサブルーチンは返却値の型が void (やそれに類似する特別な型) の関数として扱う言語が今では主流のように思われるので、最近の事情に慣れたプログラマには異質に感じられるかもしれないと思う。

Document ID: d6840502129b882ebb5789108fe7afb2