Может кто-нибудь объяснить это продолжение в схеме? - PullRequest
4 голосов
/ 01 декабря 2009

Я изучаю продолжения, но не могу обернуть голову вокруг этого кода. Почему это входит в бесконечный цикл?

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

1 Ответ

4 голосов
/ 01 декабря 2009

Строка за строкой:

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

Таким образом, в итоге мы получаем бесконечный цикл.

...