動かない動作は以下のサイトより
衝突回避と暗黙のimport - 主題のない日記
id:SaitoAtsushさん(こう書くのがHatena流だっけ?)は僕が絶対書かないタイプのマクロをガンガン書かれて、しかもそのテストにSagittariusも使ってくださっていてなんともありがたい。
ただ、まともに動いたことがない感じがするのがとても心苦しかったりもするだけれど・・・(R6RS名乗るの無理になってきたか・・・?)さて、今回の不具合はパッと見、恐らく現状のマクロ展開の仕組みを使っていると直すのがかなり厳しい気がする。問題なのは、define-settable内で定義される識別子(ここではset-dummy!)は自身の定義されているライブラリの参照としてオリジナルのライブラリ(settable-variable)を持つ(はず)。そうすると、(test-lib)内で定義されているにも関わらず、参照を解決する際にオリジナルを見に行く。っで、unbound variableが投げられて悲しい思いをする。というのがパッと見た感じのエラーの原因と思う。
(あれ?でもこんな感じのマクロはdefine-record-typeとかでも普通に使われているはずだから、そんなはずないよなぁ?)
見た感じ、このマクロは結構コーナーエッジっぽいみたいで、意図どおりに動く処理系はRacketとYpsilonのみっぽい。実際手元のnmoshで試したらエラー投げた。
ちょっとpriority低めでIssue上げとくか・・・
多分原因が分かった。variable transformerだ。こいつが捕捉された際のライブラリがオリジナルなんだ。(ひょっとしたらマクロを生成するマクロ系はこれに引っかかるのかもしれないが)。さて、どうしたものだろうか?
2 comments:
記事のコメント欄で leque さんが書いてますが、これはエラーになるのが正しい挙動です。
import した変数だけでなく export する変数にも set! できないという制限によってエラーになってたようで、マクロの問題ではなかったです。
近い内に記事にしようと思ってはいるのですが、とりあえず R6RS 的に正しくなるようにしたコードを置いときますので sagittarius での動作を検証する参考にして下さい。
http://ideone.com/FTRNQ
おぉ、ありがとうございます。早速検証してみます。
(でも、マクロ周りのバグは、多分バグなんですよね。直すべきかなぁ・・・)
Post a Comment