実践Common Lisp 9章 ユニットテストフレームワーク
やっぱり、実習系の章が面白いな。マクロの説明の後の9章。
- 第9章 実践:ユニットテストフレームワーク
だんだん、フレームワークとしてできあがってくる様子なんて、なんか、成長速度がめちゃ速いモンスターを見てるようだ。フレキシブルに拡張していく様には、Common Lispの醍醐味を感じる。しかし、実践Common Lispに出てくる例は、本当に小さい関数やマクロを組合せることでゴールに向かうんだよな。ほとんどの関数が、ほんの数行だけ(3,4行)。ここは参考にしたい。1つの関数に詰め込みすぎてしまう傾向があるので。
with-gensyms
たった一点嵌った場所は、with-gensyms。lisp処理系は、clispで試しているんだけど、マクロは存在してるんだけど、引数の仕様が違ってるみたい。
と思って検索してみると、HyperSpecではwith-gensymsマクロは定義されていないみたいだった。
31.11.6. Macro EXT:WITH-GENSYMS
Similar to its namesake from Paul Graham’s book “On
Lisp”, this macro is useful for writing other macros:
31.11.?Additional Fancy Macros and Functions
clispの拡張マクロとして定義されているけど、そこにもOn Lispのwith-gensymsから貰ったようなことが書いてあるし。clispのgen-symsマクロは、生成するシンボル名が第一引数で、gen-symsで生成されるシンボルが格納される変数名は、第二引数以降が該当するみたい。
(defmacro (prefix &rest sym-names) &body body)
みたいな、シグネチャーで定義されているみたい。
実践Common Lispで前提としているwith-gensymsマクロは、
(defmacro (&rest sym-names) &body body)
というシグネチャーとしているようだった。他の処理系では、こうなってるのかな。
でも、仕様が長所のCommon Lispなんだから、HyperSpecに無い関数、マクロには注釈があった方がいいんじゃないのかな?
ダイナミック変数
あと、ダイナミック変数の使い所にも触れられて嬉しかった。ま、他で言うところのグローバル変数なんだけど、自作ライブラリ中の関数呼び出し間のデータ共有のために使うなら途中で変更されることも無いし有用だと感じた。