Пример продолжения в схеме


У меня возникли некоторые проблемы с пониманием этого фрагмента кода, который мой профессор использовал в качестве примера:

(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 2

1 ответ:

call/cc вызывает данную функцию с текущим продолжением в качестве единственного аргумента. Таким образом, k вот текущее продолжение. Когда вы вызываете его со значением, call/cc вернется со значением, которое вы дали. (Хотя, поскольку вы не используете возвращаемое значение call/cc в приведенном выше коде, и поскольку R6RS позволяет возвращать нулевое значение в этом случае, вы можете просто вызвать saved-cont без аргументов и все равно делать то, что вы ожидаете.)

Здесь, в принципе, каждый раз, когда вы вызываете (saved-cont), код ниже call/cc снова побежит. Таким образом, x будет увеличиваться, и его новое значение будет отображаться.