(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関数で,マク ロ定義自体も取り出すことができるようにもなります.