4

私は継続を学んでいますが、このコードに頭を悩ませることはできません。なぜそれは無限ループに入るのですか?

(let ((cont #f))
  (call/cc (lambda (k)
             (set! cont k)))
  (cont #f))
4

1 に答える 1

4

1行ずつ:

  • ローカル変数を定義しますcont
  • 現在の継続でラムダ関数を呼び出します。つまり、現在の継続を引数としてラムダ関数に渡します。現在の継続は 1 つの引数の関数であり、この引数は の「戻り値」として使用されますcall/cc(ここでは最終的に無視されます)。
  • ここkでは、後に起こるすべてのことを意味し(lambda (call/cc-retval) (let () call/cc-retval (cont #f)))ます。contこの継続に値を設定します。call/cc戻り値。
  • contは継続を表す関数であり、その引数は「call/cc の戻り値」であるため、その関数を呼び出すだけで、引数は無視され、再度呼び出す必要があります(cont #f)

したがって、最終的に得られるのは無限ループです。

于 2009-12-01T04:32:45.103 に答える