CPS

Schemeの継続を実装するためには継続をオブジェクトとして扱わなくてはならない。そして、継続をオブジェクトとして扱うのならばCPSへの変換として書くのが良いのではないか(というより、他の書き方を思いつかない)。
以下はメモ。
まず、演算の最小要素として演算子A,B,C,...を考える。

A>>B
「演算Aを行うと結果Bが得られる」という関係
A==B
演算子Aに引数Bを代入する」という演算子
[A,B,C]
演算子A,B,Cのリストを返す」という演算子
A@B
演算子Aを引数Bに対して作用させる」という演算子
X$N
「リストXからN番目の値を取り出す」という演算子*1
A=>B
「演算Aの結果に対して演算子Bを作用させる」という演算子
{X|A}
「受け取った引数を仮引数Xに代入して演算Aを行う」という演算子

例を幾つかあげると

+@[1,2]>>3
{X|+@[X,X]}@1>>2
{X|X$1@[X$3,X$3]=>{Y|X$2@[Y,Y]}}@[+,*,1]>>2

という感じ。*2

A=={X|[X$1@[X$2$1,X$2$2],3]=>X$3}
A@[+,[1,2],*]>>9

変数テーブルを除けば、演算子・引数・継続の3つの要素でCPS的な演算は定義できる。

*1:Nはこの計算の定義とは関係ない

*2:結合順位を書いてなかったな。