3

私はラケットで紙の行に沿って勉強call/ccています

call/ccこの論文では、最も有利な API はプロシージャを提供することによって得られると述べていますlambda (cc) (cc cc)。この特定のcall/cc呼び出しは、現在の継続ファーストクラス オブジェクトをメイン プログラムに返すことを理解しています。

次の例では、ペーパーはこれらすべてを と呼んでいます(right-now)

私が見ているのは、その同じ例の中で、上記の呼び出しccによって返されたオブジェクトは、それ自体に適用することによって常に後で実行されるということです。call/ccそれは私が理解していないものです。

cc値として何が特別なの(cc ())かわかりません。喜びはまったくありません。明らかに、継続は、実行を開始するために、そのアプリケーションだけを必要としています。(cc (lambda () ()))(cc "whatever")(cc)

何故ですか?を行うことで cc を実行することの独自性を明確に示す例は何(cc cc)ですか?

4

1 に答える 1

2

(let ((cc (current-continuation)))
  ...)

の続き(current-continuation)

(lambda (_)
  (let ((cc _))
    ...)

これを継続と呼びますc0

の定義current-continuationは次のとおりです。

(define (current-continuation)
  (call/cc (lambda (cc) (cc cc))))

したがって、引数として次のようにcall/cc呼び出します。(lambda (cc) (cc cc))c0

  ((lambda (cc) (cc cc)) c0)
= (c0 c0)

c0 の値を挿入する:

((lambda (_)
   (let ((cc _))
     ...)
 c0)

これは次のようになります。

   (let ((cc c0))
     ...)

これは...、識別子の内部ccが値にバインドされていることを意味しますc0

(c0 42)で発生した場合 ...

私たちが得る:

   (c0 42)
= ((lamdba (_)
     (let ((cc _))
      ...)
   42)
= (let ((cc 42))
     ...)

そして今cc、値 42 にバインドされています。

この例では(procedure? cc)andを使用して、 が継続 ( true の場合) にバインドされているかどうか、または別の値 (将来の値はここでは 42)にバインドされている(future-value? cc)かどうかをテストします。cc(procedure? cc)

だから:

(define (current-continuation)
  (call/cc (lambda (cc) (cc cc))))

に渡される値(lambda (cc) (cc cc)))は継続です。それを手に入れたい場合は、それを返す必要があり、それを継続に渡すことによってそれを行います。つまり、何か (cc something)を返します。継続そのものを取得したいので、 を使用します(cc cc)

于 2015-10-26T21:11:26.860 に答える