私はラケットを使用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)
ない限り、 を評価した結果を返します。この場合、に渡された値が返されます。expr
C
C
したがって、最初の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
私が間違ったことをしてください。私は継続の概念を混乱させています。ありがとう。