2012-04-30 4 views
2

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

(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 будет увеличиваться, и его новое значение будет отображаться.

Смежные вопросы