2009年1月4日日曜日

【実践CL】8 マクロ:自分で定義しよう


  • 8.1 マックはじめて物語

    • この寓話とてもいいよなぁ。寓話なんだけど、マクロの機構をありありと表現している。

  • 8.2 マクロ展開時 vs. 実行時

    • マクロってどこに格納されてたっけ? と思って調べてみると、シンボルのfunctionスロットだった。
    • 相互参照したマクロはどうなるのだろうとためしてみると。

      CL-USER(23): (defmacro hoge (var &rest body)
      `(piyo ,var (progn ,@body)))
      HOGE
      CL-USER(24): (defmacro piyo (var &rest body)
      `(hoge ,var (progn ,@body)))
      PIYO
      CL-USER(25): (macroexpand-1 '(hoge (x) (print x)))
      (PIYO (X) (PROGN (PRINT X)))
      T
      CL-USER(26): (macroexpand '(hoge (x) (print x)))
      16922048 bytes have been tenured, next gc will be global.
      See the documentation for variable *GLOBAL-GC-BEHAVIOR* for more information.

      16808512 bytes have been tenured, next gc will be global.
      See the documentation for variable *GLOBAL-GC-BEHAVIOR* for more information.
      16814144 bytes have been tenured, next gc will be global.
      See the documentation for variable *GLOBAL-GC-BEHAVIOR* for more information.
      Error: Received signal number 2 (Keyboard interrupt)
      [condition type: INTERRUPT-SIGNAL]

      Restart actions (select using :continue):
      0: continue computation
      1: Return to Top Level (an "abort" restart).
      2: Abort entirely from this (lisp) process.
      [1c] CL-USER(27): :reset
      CL-USER(28):

      うん。止まらない。

  • 8.3 DEFMACRO

    • 要旨:マクロを書くときの3ステップの紹介。

  • 8.4 試しにマクロを書いてみる:do-primes

    • 要旨:do-primesをまずは無邪気に書いてみる。

  • 8.5 マクロのパラメータ

    • 要旨:マクロのパラメータリストはdestructuring。

  • 8.6 展開形の生成

    • 要旨:バッククォート便利。

  • 8.7 漏れをふさぐ

    • 要旨:抽象化には漏れがある。(そりゃそうだ。具象から捨象するから抽象があるのだから。)
    • 要旨:マクロは「驚き最小の法則」で仕様を決めよ。
    • 要旨:漏れをふさぐには、評価順、評価回数、展開形内部変数はgensymの3つに注意。

  • 8.8 マクロを書くマクロ

    • 要旨:マクロを書くのを楽にするのにもマクロが使える。

  • 8.9 シンプルなマクロの先へ

    • 要旨:この章はタイピングを楽にする程度のマクロだった。次章ではマクロなしでは実現できないようなことをやる。


こつこつ。

0 件のコメント: