APPLY マクロの意図

最初にAPPLY() マクロがあった方がいいんでないのみたいな事を書いて、ちゃんと何がしたいのか説明してなかったので補足。現在、C コードから apply したければ (proc . args) なるリストを作って ScmOp_apply() に渡す必要がありますが、map や call-with-input-file などは、proc と args を別々に入手するので、(proc . args) の cons は無駄です。そこで dispatcher を切り分ける際に、ScmOp_apply() とは違う引数リストを持つ ScmOp_c_apply(ScmObj proc, ScmObj args) みたいな関数を作って、それを呼べば無駄が減るな、と思ったんです。んで、c_apply と apply の違いを覚えとけ、と言うのはコンパイルエラーの元なので APPLY() で抽象化しとこうかと。
でも今では ScmOp_apply() を 1 | REST | TAIL_FLAG な関数にする方向で進めているので、そんな面倒な事をする必要はもうありません。と思ったんですが、tail_flag の処理を呼出側でするのはだるいので、やっぱり wrapper 置く必要があります。
それで apply, eval, dispatcher の関係ですが、意味的には apply == dispatcher だと思っています。でも実際に実装すると、dispatcher を一つの関数に独立させることになります。そうしないと必須引数も含めて map_eval() することになったり、関数 typecode を複数回同じ bit test に晒したりすることになってしまうので。