🦉

LispとUnixは合わせ鏡

2021/07/06に公開

LispとUnixは合わせ鏡

Lispの 「'」
の記号の意味が分かりません…

Stringにしてるんですか?

というツイートを見ました。
また、以前「リストを作りたいだけなのにクォートしなければならない」という不満ツイートを見た記憶があります。

この問題は「LispとUnixは合わせ鏡である」という認識にたてば氷解します。

評価戦略

Unix系シェルにおいて「PATH」と「$PATH」は意味が異なります。
「PATH」はただの文字列ですが、「$PATH」は「PATH変数の値を参照する」という意味合いになります。
すなわちUnix系シェルはデフォルトでは評価をしない、文字列はそのまま文字列リテラルとする戦略をとり、文字列でなく変数として評価したい場合にのみ$という記号をprefixにつけるというシンタックスになっています。

翻ってLispではデフォルトで評価をする戦略をとっています。
「PATH」はPATH変数への参照であり、評価を止めたい場合にのみQUOTEという特殊形式を用います。
(i.e. (QUOTE PATH))

QUOTEは頻繁に使うので利便性のために'というリーダマクロが設定されています。
Lisp処理系が'PATHというソースコードを読むと、'に紐付けられたリーダマクロが展開され(QUOTE PATH)というリストが生成され、しかる後に評価されます。
QUOTEは評価しないという特殊形式なので(QUOTE PATH)を評価した結果はPATHというシンボルになります。

QUOTEという英単語の意味は「引用」であることを覚えておけばセマンティクスは簡単に理解できると思います。
あなたが「僕は猫が好きだ」と発言したとして、それを誰かが引用するにあたり、「「ネコ」は同性愛者の隠語で「受け」を表すものだから、アイツはホモでタチだ」と解釈され、「彼は「僕はホモでタチです」と発言した。」と(誤って解釈された)引用をされるのは大変迷惑です。
あなたが発言したのは「僕は猫が好きだ」というものでしかなく、それが「引用」であるなら引くでも足すでも勝手な解釈で変更するでもなく文字通りそのまま「僕は猫が好きだ」という形で引用してもらわなくては困ります。
QUOTEとはそういうものです。

冒頭に記した「リストを作りたいだけなのにクォートしなければならない」という不満は、逆の立場からすると、「関数呼び出ししたいだけなのにドルをつけなければならない」という不満になります。
これはお互いに向かい合った人間が「あっちが右だ」「いやそれは左だ。あっちが右だ」「何を言う。そっちこそ左だ」と言い合いをしているようなものです。

UnixユーザにとってLispの'が不可思議なものであるなら、LispユーザにとってUnixの$も不可思議なものとなります。
Unixユーザにとって$が何も難しくない当たり前のものであるなら、Lispユーザにとって'もまた何も難しくない当たり前のものといえます。

だいぶ荒っぽい解説ですがLispを学ぶ方の一助となれば幸い!

Discussion