マクロと internal define その 2

Shiro さんの指摘を受けて今朝考えを書いたときは支離滅裂に終わった(顔。というわけで再挑戦。
でも最初に考えた通りであってると思う。マクロ m があったとして、それの呼び出し u が、環境 eu が効く位置にあったとする。m の定義は eu を含むどっかの環境 em にあるとする。
Evaluator は u を見たとき、

  1. u に書かれている m の呼び出しをを閉包と同じようにして処理する。
  2. ただし引数は評価せずに渡す。
  3. マクロの body が評価される。
  4. 展開の結果 x が返ってくる。
  5. x を u のあった位置に破壊的に代入する。
  6. x を評価する。

で、めでたく展開が完了する。破壊的代入が適切かどうかはまた後で考える。マクロの body 内で継続捕捉とか許すと危なそうだけど…
ここで Shiro さんが問題にしているのはこういうことだ (という風に理解した)。
一つは、上記の 2 をやるには、u の operator が普通の閉包とは違うことを、この段階で evaluator が知っていなくてはならないこと。
もう一つは、上記 1, 6 は eu の下で行われ、3-4 は em の下で行われる。よって、evaluator は 4 と 6 の間のどこかで em を捨てて eu を pop する必要がある。そうしないと示されたようなコードを実行するときに、internal define が正しく働かない。
でもこれらはいずれも evaluator が u がマクロ呼び出しであると知っていれば対策が打てる (あんまり効率は良くないかもしれないけど)。
一つめに関しては、operator の種類の同定はどうせ invoke する前になるので、そのときにマクロであることを判定できる。
二つ目は、戻り値がマクロであることを evaluator に知らせる必要がある = 評価結果 + なんらかの flag という多値を返さなくてはならない。が、幸い SigScheme における combination の評価は評価結果以外にも情報を返す仕組があるから、それに便乗すればおしまい。
…ということでいいのかな。SigScheme のコード読んでない人が見たらさっぱりだろうか。そんな気もする。でもこれ以上簡単に説明する舌を持たないのでしょうがない。