next up previous
Next: 3.2 マクロの展開 Up: 3 マクロ機能の追加 Previous: 3 マクロ機能の追加

3.1 マクロを取り扱うインタプリタの構造

ここで考えるマクロ機構では,フォームの第一項を評価しないとして取り扱う こととします.そうすると,スペシャルフォームかどうかを判定したと同様に, フォームの先頭のシンボルがマクロかどうかを調べ,マクロであれば,マクロ 展開をし,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日