2

次のコード ブロックは両方とも (私の考えでは) 無限ループである必要があります

これは機能します

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

(define l 0)
(define i 0)

((lambda ()
   (call/cc
    (lambda (k)
      (set! l k)))
   (write i)
   (newline)
   (set! i (+ i 1))
   (l "ignore")))

これは動作しません:

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

(define l 0)
(define i 0)

(begin
   (call/cc
    (lambda (k)
      (set! l k)))
   (write i)
   (newline)
   (set! i (+ i 1))
   (l "ignore"))

唯一の違いは、ラムダを使用するものと開始ブロックを使用するものです。2 番目のコード ブロックが機能しないのはなぜですか?

ありがとう

4

1 に答える 1

6

2 番目のケースではbegin、引数がトップレベルにスプライスされます。には2 種類beginあることに注意してください。式の位置にある場合は、操作を 1 つずつ順番に並べるだけです。2番目の種類(あなたが持っているもの)は、すべての引数を周囲のコンテキストにつなぎ合わせます。

結合されたcall/cc式の継続は、実際には空の継続です。これは、各トップレベルの式が個別に (つまり、空の継続で) 評価されるためです。letこれは、 を の周りに置くことで確認できます。これによりbegin、強制的に式の位置になります。その後、期待どおりに無限ループします。

于 2013-04-16T23:44:41.703 に答える