[Gauche-devel-jp] 継続について質問

アーカイブの一覧に戻る

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






Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る