長らく積ん読状態だったLET OVER LAMBDAが出てきたのでコロナでやることもないからぽちぽちsbclで試しながら読んでいたのですが、2章のdefmacro/g!
が動かなくていきなりはまりました。
調べると0.3で作成したflatten
の動作がquasiquoteと組み合わせて使ったときにおかしくて、
* (flatten '`(,x ,y))
(SB-INT:QUASIQUOTE ,X ,Y)
となっています。ここは,X
や,Y
ではなくてX
, Y
になるはずなのですが。ということで,X
のところをdescribe
してみると
* (describe (cadr (flatten '`(,x ,y))))
,X
[structure-object]
Slots with :INSTANCE allocation:
EXPR = X
KIND = 0
などとなんだか構造体になっていまして、これはatom扱いですからうまくいかないわけですね。
この辺までしらべてgoogleさんにお伺いを立ててみると#:g1: SBCL 1.2.2でのbackquoteの変更というのが出てきましてよく知られた問題であるようで、適当に選んだ処理系のsbclがハマリポイントだったようです。読み込んだプログラムが古き良きS式じゃなくて構造体になるのはあまり良くないような気がするんだけど、こうすると何かが便利だったりするのでしょうか。
ここの少し先でdefmacro/g!
をさらに改良したdefmacro!
が作成されて、これが後の章でも便利に使われる道具になるようなのでどうしたものかなと思ったのですが、かなり古い問題なので既に対処方法も確立していて、原著のErrataからリンクされているlet-over-lambda.lispを使えばいいようでした。