Помощь с динамическим ветром и вызовом / CC
-
27-09-2019 - |
Вопрос
У меня есть проблемы с пониманием поведения следующей программы схемы:
(define c
(dynamic-wind
(lambda () (display 'IN)(newline))
(lambda () (call/cc (lambda (k)
(display 'X)(newline)
k)))
(lambda () (display 'OUT)(newline))))
Как я понимаю, C будет связан с продолжением, созданным прямо перед «(отображением 'x)».
Но, используя C, кажется, изменяет себя! Определить выше принты (как я ожидал) в, X и OUT:
IN
X
OUT
И это процедура:
#;2> c
#<procedure (a9869 . results1678)>
Теперь я ожидаю, что когда он снова называется, X будет напечатан, и это не так!
#;3> (c)
IN
OUT
И теперь C больше не является процедурой, а вторая приводство от C не будет работать!
#;4> c ;; the REPL doesn't answer this, so there are no values returned
#;5> (c)
Error: call of non-procedure: #<unspecified>
Call history:
<syntax> (c)
<eval> (c) <--
Я ожидал, что каждая призвание (C) будет делать то же самое - печать, X, и выйти. Что мне не хватает?
Решение
Бег это в ракетке немного более полезно:
-> (define c
(dynamic-wind
(lambda () (display 'IN)(newline))
(lambda () (call/cc (lambda (k)
(display 'X)(newline)
k)))
(lambda () (display 'OUT)(newline))))
IN
X
OUT
-> c
#<continuation>
-> (c)
IN
OUT
define-values: context (defining "c") expected 1 value, received 0 values
-> (c 99)
IN
OUT
-> c
99
Обратите внимание на конкретно что c
становится связанным с величиной продолжения - потому что ваше выражение возвращается k
как значение. А также k
Сама - это продолжение выражения значения, что означает, что это продолжение - это то, что ждет, чтобы получить значение, чтобы быть связанным с c
. Отказ Так что вызывает, требуется одно значение, как требует ракеты, что помогает уточнить, что здесь происходит (схема MIT, кажется, тихо относится к нему как неуказанная). В любом случае, применение этого продолжения на 99 означает, что возвращаемое значение из этого выражения составляет 99 - так что вы прыгаете обратно в контекст (печать IN
) и вернуть 99 быть привязанным к c
, и печать OUT
на ваш выход. Теперь вы модифицировали c
Чтобы иметь это 99 вместо этого, так что вы не можете назвать его третьему раз.