CLのスペシャルに秘められた罠(?)

quoteとかsetqとかifといった特殊な制御に用いるためのシンボルって「special operator」だったんですね。
今までずっとこれらのことを「special form」だと思い込んでいました。
special formはspecial operatorを使った式のことを指すらしいです。
(CLHS Glossaryに詳しく書いてます)
今までなんでこんな勘違いをしてきてそして気づかなかったのか非常に謎です。
私がはじめて読んだCLの本である『ANSI Common Lisp』にもしっかり「特殊オペレータ」と書いてますし、
最近読んでいる『実践Common Lisp』にも「特殊オペレータ」という語が使われています。
見事なまでにスルーしてました。
しかし、よくよく考えてみるとCLtL2にはspecial operatorという語が登場しません。
それどころか、関数やマクロの説明として次のような記法を使っています。

symbol-value symbol [関数]
quote object [特殊形式]

symbol-valueの横に[関数]と書いてあり、実際にそれが関数なんだから、
quoteの横に[特殊形式]と書いてあればquoteは特殊形式(special form)ではないのでしょうか。
と、それっぽい言い訳を考えてみたんですが、

もし最初の要素が表5-1に現れたシンボルのいずれかであれば、
そのリストは特殊形式(special form)と呼ばれる。
(5.1.3 特殊形式)

という風に、式全体のことを特殊形式と呼ぶと明記されてました。
なんてこったい/(^o^)\
しかし、quoteなどのシンボル自体をspecial formと書いてある本を何処かで読んだ気がするので、
色々と探し回ってみました。そしたら、bit1985年4月号にこんな記述を見つけました。

5. 関数とスペシャル・フォーム
MacLispなどのFSUBR関数にあたるものは、Common Lispではスペシャル・フォームと呼ばれる。
しかし、スペシャル・フォームはCommon Lispの意味での関数ではない。
あとで述べるように、関数の引数は必ず評価されるのに対して、スペシャル・フォームの引数の
評価の方法はスペシャル・フォームによって異なる。

(setq)         ; 何もしない
(setq x 1)     ; 変数xに1を代入
(setq x 1 y 1) ; xとyに1と2を代入

は全てsetqという名のスペシャル・フォームであるが、変数に対応する引数は
当然のことながら評価されない。ユーザがsetqという名前の関数を定義していけないという
規則はないが、たとえ定義できてもsetqで始まるリスト・フォームはスペシャル・フォームとして評価され、
関数定義は無視されるはずである。
スペシャルフォームは表3の18個が固定されており(以下略)
(湯淺太一・萩谷昌己, Common Lisp入門 1, bit, Vol. 17, No. 4, 1985)

この説明ではspecial operatorを使った式自体のことをスペシャル・フォームと呼んでいる一方で、
「setqという名のスペシャル・フォーム」の表現が使われています。
また、表3にsetq, ifなどが「スペシャル・フォーム」として挙げられています。
わーい、天下の湯淺先生と萩谷先生がそういったんならいいじゃないかと喜んでいたら、
実はこの連載の翌年の1986年にお2人が書かれた『Common Lisp入門』にて

2. スペシャル・フォーム
次の記号のどれかを第一要素とするリスト。
block macrolet(以下略)
(1.5 評価とフォーム)

special operatorはもはや「記号」としか書かれなくなりました。
他の箇所を読んでも「setqと呼ばれるスペシャルフォーム」みたいな表現は一切ありませんでした。
なんてこったい/(^o^)\
結局、quoteやsetqといったシンボルのことをspecial formというのは単なる間違いだったのか、
それとも昔はそう呼んでいた時期があったのか、非常に気がかりです。
話は変わりますが、Common Lispは、スペシャル変数があるのに、
なんでスペシャル関数がないんだという、どうでもいいことに気づいてしまいました。
ほんと何でないんでしょう。使い道がないからなのか、スペシャル変数で代用できるからなのか…

Leave a Reply