etolisp 進捗 (8) defmacro の実装
恐らく,私は,Lisp を理解する前に,インタプリタを実装しようとしている,数少ない部類の人だと思う。で,今日は defmacro を良く理解せずに,とりあえず実装してみた。
(defmacro nil! (x) `(set ,x nil)) (nil! y)
に相当するコードを,実装済の関数で実現しようとすると
(defun nil! (x) `(setf ,x nil)) (eval (nil! 'y))
である。いまのところ,defun は lamda(関数)型の変数を作って,それを setf するだけの実装になっている。lambda は通常の関数と同じように引数を評価するので,
(nil! y)
と書いてしまうと,y のシンボル名を解決しようとしてエラーが起こってしまう。なので, (nil! y) と書いたときに,(eval (nil! 'y)) を実行してくれるような lambda(ローカルなコンテキストは必要なので,lambda を利用する)の派生オブジェクトを作れば OK かな〜と考えている。
まとめると
- defmacro は defun とほぼ同じ実装。ただし lambda(関数)ではなく,lambda もどき(macro型と名付けるか)のオブジェクトを setf する
- lambda と macro はほぼ同じ実装。引数の評価,実行のマナーが多少異なるだけ。
上手くいくかな。defmacro が出来るようになると,開発の速度はグンと上がることが期待できるだけに,楽しみだ。