Пример продолжения в схеме
У меня возникли некоторые проблемы с пониманием этого фрагмента кода, который мой профессор использовал в качестве примера:
(define saved-cont #f)
(define (test-cont)
(let ((x 0))
(call/cc
(lambda (k)
(set! saved-cont k)))
(set! x (+ x 1))
(display x)
(newline)))
Если мы запускаем в первый раз (test-cont)
, что содержит k
?
Примечание: я использую схему R6RS.
1 ответ:
call/cc
вызывает данную функцию с текущим продолжением в качестве единственного аргумента. Таким образом,k
вот текущее продолжение. Когда вы вызываете его со значением,call/cc
вернется со значением, которое вы дали. (Хотя, поскольку вы не используете возвращаемое значениеcall/cc
в приведенном выше коде, и поскольку R6RS позволяет возвращать нулевое значение в этом случае, вы можете просто вызватьsaved-cont
без аргументов и все равно делать то, что вы ожидаете.)Здесь, в принципе, каждый раз, когда вы вызываете
(saved-cont)
, код нижеcall/cc
снова побежит. Таким образом,x
будет увеличиваться, и его новое значение будет отображаться.