TL/1 の変なところ (名前解決)

1980 年頃に一部で使われていたプログラミング言語に TL/1 というものがある。 近い時期の WICS や GAME といった言語についてはウェブ検索すれば少ないながらも言語仕様についての資料が見付かるのだが、 TL/1 については情報がとても少ないので私が知っていることをまとめようと思いながら十余年も経ってしまった。 ようやくひとつの文章にまとめたので公開することにする。

http://www7b.biglobe.ne.jp/~saia/tl1.html

TL/1 の仕様には他の言語では珍しい奇妙な点がある。 そのひとつが名前解決のルールに関してだ。 TL/1 は予約語と重複する名前を変数名等につけることを許している。 例えば条件分岐のための構文である IF と同じ名前の変数を作ることも可能だ。

VAR IF
BEGIN
  IF := 123
END

言葉の定義の仕方によってはそれはそもそも「予約語」ではないとも言えるのかもしれないが、他に妥当な言葉が思い付かないので勘弁して頂きたい。 また、私の手元にある古い雑誌記事でも予約語という言葉を使っている。

では TL/1 では具体的にどのようなルールで名前の意味を確定するかというと、以下のような優先順位で名前テーブルを探して最初に見付かったものを採用することになっている。

  1. ローカル配列
  2. ローカル変数
  3. グローバル配列
  4. グローバル変数
  5. 関数名
  6. 手続き名
  7. 予約語

定義を閉じるための予約語 END を変数として定義してしまったりすれば有効なプログラムを書くことが出来ないので注意が必要だが、それ以外の予約語については場合によっては別の意味に割当てることは理屈の上では可能なわけだ。 尤も、まともなプログラマならそんなことをしようとは思わないだろうが。

Document ID: c75b20a5f74e6fda6e0d48c002aaba2a