Вопрос

У меня есть проблемы с пониманием поведения следующей программы схемы:

(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 вместо этого, так что вы не можете назвать его третьему раз.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top