マクロと構文

 define-syntaxは構文を定義しているのだろうか?そもそも、構文ってなんだろう?引数を評価しなかったりするかもしれない何か、という解釈は正しくないような気がする。
 Scheme入門では、フォームを「式とみなされるデータ」とし、ifやdefineなどは「特殊なフォーム」であるとしている。どう特殊なのかは書いてないが、要するに、関数では書けないものが特殊フォームである、という解釈で良い、のかしら。
 こんな時には仕様書を参照するべきである。まず、R5RSより。

 識別子はtype of syntaxの名前になるか、値が収納される場所の名前になる。type of syntaxに名前をつける識別子をsyntactic keywordと呼び、syntaxに束縛されていると言う。

 うーむ、type of syntaxはなんと訳すべきかわからないが、とにかく、syntactic keywordは変数ではない、という事がわかった。次に、R6RSから。

 letは識別子ではあるが変数ではない。変数ではなく、syntactic keywordである。syntactic keywordをオペレータとして持つ式は、キーワードによって決定される特別なルールに従う。定義を行う時のdefineもsyntactice keywordである。そのような訳で、定義も手続き呼び出しではない。

 通常の関数呼び出しのルールに従わない特別な式を定義するためのキーワードが構文キーワードであり、そのような特別なルールの事を構文と呼ぶ、という事で良いように見える。
 というか、構文キーワードは変数ではない、という事実を今まで知らなかった。なんで変数ではないのだろうか。書き換えてほしくないからだろうか。それとも、構文はあくまで評価の際のルールだからだろうか。でも、ルールだってデータなんじゃないだろうか。そうするとやはり、書き換えてほしくないということだろうか。よくわからない。
 ちなみに、(set! if "a")を実行すると、Gaucheは文句を言わずにifに"a"を束縛する。Guileはスタックオーバーフローを起こして終了する。