TL/1 の変なところ (WRITE 文)

プログラミング言語 TL/1 においては出力は WRITE 文によって行う。

今更だがプログラミング言語入門の伝統に則って hello, world を表示するプログラムを示すことで WRITE 文の使用例としよう。

BEGIN
  WRITE(0: "hello, world", CRLF)
END

ここで WRITE 文の最初で示しているゼロは出力装置を表している。 ファイルやプリンタやコンソールだ。 アーキテクチャによるがおおよそはファイルディスクリプタと考えてよいと思う。

今までの記事でも説明なしに WRITE 文を使っているが、聡い人は違和感を感じたかもしれない。 TL/1 の特徴として定数は 1 バイト幅の整数であると述べているにもかかわらず、ここでは文字列定数が現れているではないか。

だがその考え方は違う。 あくまでも WRITE 構文の一部として出力文字を指定しているのであって、文字列定数を渡しているわけではないのだ。 改行を指定するために書いてある CRLF という語も何かの値に解釈されるわけではなく WRITE 構文の一部である。

その他に WRITE で指定できる出力の内容は以下の通りだ。

式の値を十進数で左詰めに出力する。
#(式1, 式2)
式2の値を式1の桁数で十進数右詰めに出力する。
"文字列"
ダブルクォーテーションで囲まれた文字列を出力する。
ASCII(式)
式の値を ASCII コードと解釈して相当する文字を出力する。
SPACE(式)
式の値の個数分だけ空白を出力する。 式の値がゼロのときは何も出力しない。
CRLF
一回だけ復帰改行する。
CRLF(式)
式の値の回数だけ復帰改行する。 式の値がゼロのときは何も出力しない。
HEX(式)
式の値を十六進数二桁で出力する。

もちろん、この ASCII や SPACE 等も単独では意味のない WRITE 構文の一部である。

これらをカンマで区切って並べることで出力する内容を指定するわけだ。

かつてのプログラミング言語では文字出力をライブラリではなく組込構文として持っていることは珍しくなかったわけだが、現代では一般の関数・手続きと同列に扱う言語が多いようなのでその違いには注意が必要だろう。

Document ID: e7d015447f977c0400ed3cba79b8db9a