inline #4 special-form に展開しちゃダメ?

どうも compiler::optimize-form の関数が返す form は special-form になってはいけないようだ。

compile.l の関数が何やってるのかどうにもよくわからん。
macro はとにかく展開するんで、form は最終的に

  • 関数呼び出し
  • special-form

のどっちかになるはずで、そっから byte-code*1 にするのはそれぞれ別の処理になってるっぽい。関数呼び出しは compile-call という関数。special-form はその special-form の operator の compiler::special-form にある関数。
そんで、compiler::otpimize-form の関数で inline 展開する compile-form という関数が、inline 展開する前に special-form だったらそっちに投げるということをしていて、inline 展開後に special-form になるというのは想定してないっぽい(compiler::special-form をチェックしないで compile-call に投げてる)。
なので inline 展開後の form でもっかい compiler::special-form をチェックするようにしてみたのだけど、いかんせん元々何やってるのか把握し切れてないうえ、おかしくなっててもエラーとか出ないこともある(compile はできるけど、それを実行すると永久ループになったりする)し、おかしいことがわかっても byte-code 見てなにがどうなってるのかはわからないんで、これでだいじょぶなのかわかんない。


closette の byte-compile もそうだけど、どこがどうダメなのかわからんと対策しても対策できたのかどうかわからんから困る。

*1:"insn" とかいう一時的な形式にして、それを最終的に byte-code にしてるみたい