日付が変わって apply

Rest と固定引数の組み合わせが邪魔だなぁ。かと言ってどっちも省きたくないし。

とりあえず、引数の組合せとそれを使うのが自然な関数をまとめてみた。

car(1), eq?(2), eval(2), quote(1), quasiquote(1), define(2), unquote(1), quotient(2), force(1), abs(1), scheme-report-environment(1), set-car!(2), set-cdr!(2) symbol->string(1), most I/O procedures, ...
env
set!(2)
eval_state
無し?
rest
map(2), values(0), if(2), number->string(1), string->number(1), list(0), member(2), assoc(2), append(0 or 1), logand(1), string-append(0 or 1), read(0), ...
rest env
lambda(1), delay(1)
rest eval_state
do(2), apply(2), begin(0), cond(0), and(0), or(0), case(1 or 2), let(1 or 2), ...

むっちゃくちゃ偏ってるよ… eval_state とか一つも見当たらないよ…
これを見ると、 eval_state と env は省略していいことがわかる (set! は rest env にすればいい)。env と eval_state も void* で抽象化すれば統合できるので、次のような振り分けを考える。

  • rest
  • rest env_or_eval_state

おお、12 種類に収まった。これならいけるぞ! ヤマケンさんのおかげだ。