私は継続を学んでいますが、このコードに頭を悩ませることはできません。なぜそれは無限ループに入るのですか?
(let ((cont #f))
(call/cc (lambda (k)
(set! cont k)))
(cont #f))
私は継続を学んでいますが、このコードに頭を悩ませることはできません。なぜそれは無限ループに入るのですか?
(let ((cont #f))
(call/cc (lambda (k)
(set! cont k)))
(cont #f))
1行ずつ:
cont
call/cc
(ここでは最終的に無視されます)。k
では、後に起こるすべてのことを意味し(lambda (call/cc-retval) (let () call/cc-retval (cont #f)))
ます。cont
この継続に値を設定します。call/cc
戻り値。cont
は継続を表す関数であり、その引数は「call/cc の戻り値」であるため、その関数を呼び出すだけで、引数は無視され、再度呼び出す必要があります(cont #f)
。したがって、最終的に得られるのは無限ループです。