COMMON LISP JP > Archives > 2015/07/03

2015/07/03 22:37:15 UTCg000001
#
どうでも良い疑問なんですが、複雑なマクロを組むと抽象化の漏れが(主に難解なエラーメッセージとして)発生するという話を耳にしました。
#
皆さんはCommon Lispについてそういう経験ってあるのでしょうか。
#
何かあれば教えてもらえると嬉しいです。Common Lispのマクロについてそういう印象は自分は全然無いんです。Common Lispに馴れすぎたのでしょうか。
#
例えばLOOPは結構複雑です。しかし、これで印象に残るようなことはあんまりないですね。もっと複雑なケースでしょうか。
#
他に考え付くとしたら、展開時にシンボルを生成してて、それがスッポ抜けるとかでしょうか。しかもそれが多段になる。しかし、これは、マクロシステムの問題というよりどっちかというとスタイル的にまずい例な気がしますね。
2015/07/03 22:50:15 UTCg000001
#
ちなみに個人的にマクロでデバッグが難しいと思って印象に残っている例では、オブジェクトシステムのブートストラップで3000行位のコードを生成しているものでした(古いPortable CommonLoops) これがコケるのですが、ブートストラップでエイヤとやっている箇所なので厳しかったです
2015/07/03 22:54:26 UTCg000001
#
あとは、srfi-86をCommon Lispで動かしてみたんですが、これも割と面倒でした http://srfi.schemers.org/srfi-86/srfi-86.html
#
どっちかというとlisp-1 vs lisp-2の問題な気がしますが、それに関連したエラーを追い掛けるのがしんどい感じでした。syntax-rulesの箇所をmbeというもので代用しましたが、展開されるマクロの状態遷移が激しいのでCommon Lispのマクロのデバッグとはまた違った感じでした。
#
mbe+Common Lispでは展開がmacroexpand-1される度に遷移するので、まだ追い掛けられましたが、Schemeだと最終展開までが一発らしいので、それだとどうやってデバッグするのかなあと思ったりはします。