空想犬猫記

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

Macro 再考

風も日差しも強く,波も悪そうなので,海に行かず Lisp のマクロについて,もう一度読み直してみる。どうやら7ヶ月前に妄想したこと(進捗(8) )がだめだったのかもしれない。

Practical Common-Lisp を読み直して,もう一度マクロについてまじめに考えてみる。どうやらマクロをどのように実現するかは,言語仕様によって規定されているわけではないようだ(仕様からではなく,実用書からこういう情報を仕入れるのは遠回りかもしれないけど,読んだら読んだで頭痛がしてコードを組む気が失せるし・・・笑)。というわけで,プリプロセスではなく実行時にマクロを動的に評価する方針でいこうと思う。この選択にあまり迷いはない。プリプロセッサは後から追加できるし。

ただやっぱり,いまだに根本的なことを理解していない。

(defmacro ntimes (n &rest body)
  (let ((g (gensym))
        (h (gensym)))
    `(let ((,h ,n))
       (do ((,g 0 (+ ,g 1)))
           ((>= ,g ,h))
           ,@body))))

というのは,Common-Lisp では正しい定義だ。でも1つ目の let に quote が必要ない理由がまだわかっていない。ntimes を展開するときに,最初の let の評価はスルーされるってことなんだろうか。ううむ

マクロというよりも let などの special operator なるものを理解してないのか。

追記:

ううむわかった。ちゃんと最初の let を評価してた(上のほんの最後のほうに書いてあった!)。変数のスコープにさえ気をつければ,進捗(8) の路線でいけるかもしれない。