Может кто-нибудь объяснить это продолжение в схеме?

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

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

person unj2    schedule 01.12.2009    source источник
comment
Я беру его, но мы не достигли этого. :)   -  person unj2    schedule 02.12.2009


Ответы (1)


Построчно:

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

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

person Ivan Tarasov    schedule 01.12.2009
comment
Таким образом, в трех случаях использования cont в примере мы имеем его: (1) он определяется как логическое значение #f, (2) устанавливается в значение продолжения k, (3) вызывается как функция с логическим аргументом # ф? - person Chris Conway; 01.12.2009
comment
@Крис. Ага. Но #f — это просто фиктивное значение. У нас может быть нуль или что-то еще, потому что в обоих случаях он игнорируется. - person unj2; 02.12.2009