継続マラソン - 継続の実装方法を考える4

arinoさんから質問を頂いた。

arino 『現在の実装では、関数の引数が別の関数呼び出しの結果になっている場合、どう処理されているのでしょう?
(func1 (func2))みたいな形。
Cの世界での再帰

(func1 (func2) (func3))


の場合は、内部的には

apply(func1, 配列[func2, func3])


のように apply に渡されます。(疑似コードです)
更に apply の先頭で

apply(procedure, arguments)
{
   foreach (argument) {
        argument->eval() // ここでfunc2, func3がそれぞれ呼ばれる
   }

という感じです。