SSブログ

S式の不可解さについて [Lisp]

Lisp:S式の理由 [1] というページから。

Lispの括弧は特殊形式か関数適用である、というのが大原則なんですが、 Lispにはそれ以外の意味で括弧が使われる場合があります。letの変数のグループ化や、condの節の区切りですね。 個人的には、このような意味の違うものは別に見えていて欲しいです。 ...

以前にも少し書いたのだけど私の場合むしろ「意味の違うものは別に見えていて欲しい」というのを cond などの特殊形式の存在そのものについても思う。何故同じ形なのに中の要素が展開されるかされないかということに個別の例外がいくつも存在するのだろうか。

例えば Tcl では条件分岐などの制御構文と普通のプロシージャで「引数が展開されるかされないか」という規則に区別はない。

puts [read stdin] とするとまず read stdin が解釈されてその結果を引数として puts が呼び出される。一方で if $flag {read stdin} と書いた場合は read stdin を解釈した結果が if に渡されるのではなく read stdin というコードブロックが if の第2引数となる。

でもこれは if というコマンドの特殊性からくるのではない。もし if $flag [read stdin] と書いていた場合は read stdin が先に解釈されてその結果が if の引数になる。一方でもし puts {read stdin} と書けば read stdin はコマンドとして実行されずに read stdin という文字列が puts の引数になるだろう。つまり展開されるかされないかということは大括弧と中括弧との違いからきていて、意味解釈が違うので違う形式が与えられている。

言い換えると Tcl の if はプリミティブではあるけれど特殊形式ではない。言語にプリミティブなオペレーションが必要であるということは自明だけど、その中のいくつかが特殊形式でなければならないということは自明ではないと思う。解釈方法の異なる表現を同じシンタクスにまとめてオペレータの種類で解釈しわけるという Lisp のデザインは私には相当乱暴に映ってしまう。こんな疑問を持つ人は少ないのだろうか。

[1] http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3aS%e5%bc%8f%e3%81%ae%e7%90%86%e7%94%b1


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。