私はラケットを使用4し、次の単純なコードの結果を得ました。
(let/cc done
((let/cc esc
(done (+ 1 (let/cc k
(esc k)))))
3))
このコードを段階的に実行するつもりでした。
まず、最初のものを次のようなlet/cc形式に変更しました。call/cc
(call/cc (λ (done)
((let/cc esc
(done (+ 1 (let/cc k
(esc k)))))
3)))
もちろん、これ4も生産します。
第二に、私は次の4つのステップを行うcall/ccというインターネットのメカニズムを見つけたので:call/cc
- 現在の継続をキャプチャします。
- 引数を 1 つ取る関数を構築し、
Cその引数値で現在の継続を適用します。 - この関数を引数として
expr--- に渡します。つまり、 を呼び出します(expr C)。 - を呼び出さ
(expr C)ない限り、 を評価した結果を返します。この場合、に渡された値が返されます。exprCC
したがって、最初のcall/ccように上記の手順に従いました。
- 現在の継続はアイデンティティです。
Cを指し(λ (x) x)ます。exprであるため(λ (done) ((let/cc esc (done (+ 1 (let/cc k (esc k))))) 3))、次の(expr C)とおりです。((λ (done) ((let/cc esc (done (+ 1 (let/cc k (esc k))))) 3)) (λ (x) x))上記のコードの結果値を返すために、racket で上記を実行します。
ただし、上記のコード (私が変更) は実行されず、エラーが発生します。
> application: not a procedure; > > expected a procedure that can be applied to arguments > > given: 4 > > arguments...: > > 3
私が間違ったことをしてください。私は継続の概念を混乱させています。ありがとう。