LoginSignup
1
1

More than 3 years have passed since last update.

LET OVER LAMBDAをsbclで試しながら読んでいたらいきなりはまった

Posted at

長らく積ん読状態だった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を使えばいいようでした。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1