Я изучаю продолжения, но не могу понять этот код. Почему он входит в бесконечный цикл?
(let ((cont #f))
(call/cc (lambda (k)
(set! cont k)))
(cont #f))
Я изучаю продолжения, но не могу понять этот код. Почему он входит в бесконечный цикл?
(let ((cont #f))
(call/cc (lambda (k)
(set! cont k)))
(cont #f))
Построчно:
cont
call/cc
(и здесь в конечном итоге игнорируется).k
здесь означает все, что будет после, в нашем случае что-то близкое по смыслу к (lambda (call/cc-retval) (let () call/cc-retval (cont #f)))
. Присваиваем этому продолжению значение cont
. call/cc
возвращается.cont
теперь является функцией, представляющей продолжение, а ее аргумент является «возвращаемым значением call/cc», мы просто вызываем эту функцию, аргумент игнорируется, и нам нужно снова вызвать (cont #f)
.Таким образом, в итоге мы получаем бесконечный цикл.