質問

私は、次の行動を理解するいくつかの問題を抱えています Schemeプログラム:

(define c
  (dynamic-wind
    (lambda () (display 'IN)(newline))
    (lambda () (call/cc (lambda (k)
                     (display 'X)(newline)
                     k)))
    (lambda () (display 'OUT)(newline))))

私は理解しているように、cはcontinutionにバインドされますが、直前に作成した "(表示「X)" を。

が、Cを使用しては、それ自体を変更するようです!

:(私は予想通り)中、X及びプリントアウトの上に定義します
IN
X
OUT

そしてそれは、手順は次のとおりです。

#;2> c
#<procedure (a9869 . results1678)>

さて、私はそれが再び呼び出されたときに、Xが印刷されることを期待し、それはない!

#;3> (c)
IN
OUT

そして今、cはもう手続きではなく、Cの第二invokationうではない仕事!

#;4> c    ;; the REPL doesn't answer this, so there are no values returned
#;5> (c)

Error: call of non-procedure: #<unspecified>

        Call history:

        <syntax>            (c)
        <eval>              (c)    <--

私は(c)の各invokationが同じことをするだろうことを期待していた - には、X、およびOUTを印刷します。私は何をしないのですか?

役に立ちましたか?

解決

ラケットでこれを実行すると、もう少し便利です。

-> (define c
     (dynamic-wind
       (lambda () (display 'IN)(newline))
       (lambda () (call/cc (lambda (k)
                             (display 'X)(newline)
                             k)))
       (lambda () (display 'OUT)(newline))))
IN
X
OUT
-> c
#<continuation>
-> (c)
IN
OUT
define-values: context (defining "c") expected 1 value, received 0 values
-> (c 99)
IN
OUT
-> c
99

cが継続値にバインドされます、特にことに注意してください - あなたの表現が返す値としてkので。そしてk自体は、この継続がcにバインドする値を取得するために待機している1つであることを意味する値式、の続きです。ラケットの必要に応じてそれを呼び出すようすること(MIT Schemeは静かに指定されていないとして、それを扱うように見える)ここで何が起こるかを明確に役立つ、単一の値が必要です。とにかく、その式の戻り値が99であることを99件の手段でこの継続を適用する - あなたは、コンテキスト(印刷IN)に戻ってジャンプしc の、印刷OUT上にバインドするを99に戻しますので、あなたの方法アウト。あなたは今、あなたは三度それを呼び出すことはできませんので、代わりにその99を持つようにcを修正しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top