LISP Scheme Part5
■ このスレッドは過去ログ倉庫に格納されています
0435デフォルトの名無しさん
NGNGあの説明は分かりにくい。R5RSでは削られたんだし、忘れよう。
低レベルのhygienicマクロを理解したければor使いたければ
標準ではないが、syntax-caseの動作を見るのが良いと思う。
identifierとは、変数を表すシンボルに束縛情報がくっついたものだと
思えば良い。
(define-macro foo
(syntax-rules () ((_ val) (let ((a 3)) (+ a val)))))
というマクロを考えてみる。これは次のように展開される。
(foo 4) ===> (let ((a 3)) (+ a 4)) ==> 7
では次の式はどう展開されるか。
(let ((a 2)) (foo a))
字面で展開すると
(let ((a 2)) (let ((a 3)) (+ a a))) ==> 6
となってしまいそうだが、hygienic macroにおいては、
* マクロfooに渡されるaというidentifierは、let ((a 2))で束縛されたもの
* マクロfoo内で使われるaとういidentifierは、マクロ内で挿入されるlet ((a 3))で束縛されるもの
というふうに束縛情報を一緒に持っているので、ふたつのaが混同される
ことがない。つまり
(let ((a 2)) (foo a)) => 5
となる。
で、これと同じことをsyntax-rulesを使わずに表現しようとすると、
「束縛情報をデータに付随させる」という操作を明示する必要が
ある。それに使われるのがsyntax。
■ このスレッドは過去ログ倉庫に格納されています