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