Next: 3.2 マクロの展開
Up: 3 マクロ機能の追加
Previous: 3 マクロ機能の追加
ここで考えるマクロ機構では,フォームの第一項を評価しないとして取り扱う
こととします.そうすると,スペシャルフォームかどうかを判定したと同様に,
フォームの先頭のシンボルがマクロかどうかを調べ,マクロであれば,マクロ
展開をし,interpを再帰的に呼ぶというinterp の定義になります.
(defun interp (x &optional env)
(cond
((symbolp x) (get-var x env))
((atom x) x)
((member (car x) '(quote begin set! if lambda))
(interp-specialform (car x) (cdr x) env))
((scheme-macro (car x))
(interp (scheme-macro-expand x) env))
(t
(interp-procedure (car x) (cdr x) env))))
というぐあいに,スペシャルフォームかどうかを判定した
ところと同じレベルでマクロフォームかどうかを判定できます.
マクロかどうか判定するための方法としては,
マクロ関数名の集合を拾い上げて覚えるという方法も
考えられますが,そのシンボルの属性リストに
マクロかどうかを記しておくという方法もあります.
マクロの定義自体をどこかに保存しておかなければ
なりませんから,ある特別の属性リストに定義がなされて
いればマクロであると判定するということにすれば,
(defun scheme-macro (symbol)
(if (symbolp symbol) (get symbol 'scheme-macro)))
という具合に,シンボルのある属性(scheme-macroという属性)を調べるとい
う関数で判定することにします.こうしておけば,scheme-macro関数で,マク
ロ定義自体も取り出すことができるようにもなります.
generated through LaTeX2HTML. M.Inaba 平成18年5月6日