>>164
むー、そうかな。

トップレベルがSchemeで書いたread-eval-printループを実行してるとしても
同じだよ、と言う意味なんだが、そうするとどことどこが不連続になるんだろ
うか。(もちろん実際どうなってるかは処理系による。)

>>165
フックってのは、
 obj **stack[N]; /* GCのルート"を指す"間接ポインタ */
 obj **sp = stack;
 #define gc_protect(var) (stack_check(), *sp++ = &(var))
 #define gc_unprotect(n) (sp+=n)

 obj *append(obj *list1, obj *list2)
 {
  obj *tmp;
  gc_protect(list1);
  gc_protect(list2);
  ...cons(list1, list2);
  gc_unprotect(2);
 }
みたいな意味じゃないの?

漏れが言ってるのは、上よりも、
 obj *stack[N]; /* GCのルート */
 obj *append(int argc, obj *argv[])
 /* 引数はargv(スタックのどこか)に入って渡される */
 {
  ...
 }
とか、
 obj *reg0, *reg1, *reg2, ...; /* GCのルート */
 obj *stack[N]; /* これもルート */
 obj *sp = stack;
 #define push(val) (stack_check(), *sp++ = (val))
 #define pop() (*--sp)
 obj *append(void)
 /* 引数はreg0とreg1に渡される */
 {
  ... push(cons(reg0, reg1));
 }
とかの方が良いんじゃないか、ということなんだが…