CPSを律儀に実装

CPS(Continuation Passing Style)とは?登場人物は次の三つ。

  1. 処理A
  2. 引数B
  3. 処理C

実際にやりたいのは「処理Aに引数Bを渡して実行した後、その結果を引数として処理Cに渡して実行する」というものだとする。

function A(arg){
  //do something
  return result;
}
function C(arg){
  //do something
  return result;
}
function execute(){
  var result = A(B);
  C(result);
}

普通にjavascriptで書くと↑のような感じになるだろうか。それぞれの実行結果はreturnで返され、スタックに積まれた順を遡って復帰する。

function A2(arg,continuation){
  var result = A(B);
  continuation(result);
}
function execute(){
  A2(B,C);
}

無理矢理CPS化すると↑のような感じになるだろうか。A2にはBとCを一つの引数にまとめたものが渡され、実行順が制御されている。returnによるスタック消費は必要ない。