空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

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 かな〜と考えている。

まとめると

  1. defmacro は defun とほぼ同じ実装。ただし lambda(関数)ではなく,lambda もどき(macro型と名付けるか)のオブジェクトを setf する
  2. lambda と macro はほぼ同じ実装。引数の評価,実行のマナーが多少異なるだけ。

上手くいくかな。defmacro が出来るようになると,開発の速度はグンと上がることが期待できるだけに,楽しみだ。