Shiro Kawai
shiro****@lava*****
2003年 1月 28日 (火) 14:38:05 JST
ちょうど、日本からの戻りの機内で記事「なんでも継続」を 書いていました。詳しいところはそれを待って頂くとして、 一応説明してみます。 From: Makoto Satoh <makot****@yahoo*****> Subject: [Gauche-devel-jp] 継続について質問 Date: Tue, 28 Jan 2003 13:35:08 +0900 (JST) > この「手続きが戻ってこない」「行ったっきり」というのは、手続きの > 呼び出しは、何らかの戻り値を返すものではない、例えば、 > > (define a (+ 1 2)) > > では、aに3が束縛されるが、この3は手続き+の戻り値ではなく、単に > 手続き(+ 1 2)を評価した結果である、という理解で正しいでしょうか? CPSでは手続き'+'は戻って来ないので、上のようには書けません。 トップレベルの環境はR5RSでもあまり明確に定義されて いないのでちょっと扱いが厄介なんですが、トップレベルの環境に 束縛を導入する特殊なオペレーション%toplevel-bindとかいうものが あったとして、トップレベルの変数aに1+2の結果を束縛したいのなら、 CPSではこんな感じになるでしょう。 (+/cps 1 2 (lambda (sum) (%toplevel-define 'a sum))) '+/cps'は数値2つと継続手続きを取って、数値を加算した結果を継続 手続きに渡すものとします。したがって、ここでは結果の値3が継続 手続きのsumに渡されて、手続きtoplevel-defineにより束縛が 行われます。 では上の式全体の戻り値はどうなるのでしょう。CPSでは上の式 そのものも呼び出したら戻って来ないので、上の式を評価する人が 値の受け取り手である手続きを渡してやる必要があります。また、 %toplevel-bindもCPSの場合はその結果の値を渡す継続手続きを 取る必要があります。上の式を評価する人が渡す継続手続きをcont とすると、こんな感じになるでしょう。 (+/cps 1 2 (lambda (sum) (%toplevel-define/cps 'a sum cont))) このように、CPSでは式を評価する際に常に評価する側から継続が 渡され、評価される式は最後にその継続へ式全体の結果を渡します。 --shiro