Lisp本積読解消: ANSI Common Lisp 10 マクロ — #:g1

Posted 2017-02-21 17:43:33 GMT

今回は、ANSI Common Lisp / ポール・グレアムの10章 マクロを読む。 2003年位に本屋で立ち読みしてLispのことはさっぱり分からないが面白そうなので購入。

10 マクロ

やはり、ポール・グレアム(pg)氏の文章は面白い。
若干の主張の偏りはあるが、面白い文章でCommon Lispの入門ができるというのは素晴しい。
偏っている所が面白い所でもある。

まず、評価器の話から始めて、マクロの話につなげる。
マクロのメリットが説明されるが、ここで脚注に関数の評価について何故か細かい注釈がある。
関数と引数の評価についてだが、ANSでいうと、

あたりの話だと思われる

(progn
  (defun foo (x) (+ x 3))
  (defun bar () (setf (fdefinition 'foo) (lambda (x) (+ x 4))))
  (foo (progn (bar) 20)))

上記が23になるか、24になるかは処理系依存。
ちなみに、SBCL、GCL、Allegro CLあたりは23、LispWorks、Clozure CL、ECLは24になった。同じKCL系のGCLとECLで違っているのがちょっと不思議

更に話が逸れるが、Macro Forms as Placesの話もさらっと書いてあった。
読んだ筈だったが、すっかり忘却してしまっていたらしい……。

閑話休題。次にバッククォートの説明がされ、マクロの使い方と、マクロの設計について、またマクロ作成時に注意する点等が一通り解説される。

マクロの設計について色々語る本は少ないと思う(On LispとかLet Over Lambda等目立つ本はあるが……)。

次に、一般化参照の解説と、マクロを書くためのユーティリティを解説し、最後に、未だ開拓され尽されてはいないマクロの可能性で締める。

練習問題も考えさせるような問題で良くできていると思った。

気になった所

aifitcall-next-methodの引数省略のようなものが同列に説明されているけれど、ちょっと違うのではないかなあと思った。

結び

「マクロを書くというのは〜コンパイラを書き換えられるのとほとんど一緒である」のような言い回しにやはりセンスを感じる。

解説内容も親切で詳しいし、この章にCommon Lispのマクロを書く上で必要なことは、殆ど全部書いてある。面白いので読んだことがない人にはお勧めしたい。
また、pg氏のようにマクロのユーティリティを積み上げていく独特のスタイルについては、On Lispのコードや、ユーティリティ集、Arcのユーティリティのソースコードを読むと雰囲気がつかめる


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus