Let's start Scheme

2014-02-06

マクロのバグを非常にひどい方法で解決したのでメモ

どこかにメモしておかないと忘れるw

一つ前の記事でaifのitがマクロにくるまれるとうまく参照できないというバグの話をしたが、一応直したのでメモ(というか、FIXME的な何か・・・)。

どうしたか。
問題はマクロ展開時に生成される識別子の環境が不十分なために参照する際に大雑把にしか(というと語弊があるが)識別ができなかったこと。ただ根本を解決せず搦め手で直してしまった。
このit識別子を参照可能にすると、syntax-rules内でネストした識別子の誤参照が置き、不可能にすると、まぁitが見えないという状況に置かれたので、とりあえずコンパイル時環境に何が入っていて何を見つけないといけないかを大まかに見てみたら、参照可能にした場合は同一の識別子が後ろにあるにもかかわらず一つ二つ前のものを誤参照していた。そこで、一度全部環境を舐めてから見つからなかった場合にそれっぽいものを返すという荒業を使うことにしている。もちろんバグの匂いしかしないw

根本的には全く解決されていないので、正しくは環境(恐らく)テンプレート変数のコピーをする際にオリジナルの環境をそのまま使うのではなく、何かしらマークを入れてやり識別可能にするという方法を取るべきなのだろう。ただ、何をどうすればいいのかさっぱり分かっていないので、どうしたものかという感じ。

No comments:

Post a Comment