Окружающая среда не является продолжением? - PullRequest
2 голосов
/ 14 мая 2011

Не является ли окружение частью схемы?

Я проверил это с Chicken, Gauche, Racket и Gambit, и все они ведут себя одинаково:

(define kont #f)

(let ((a 1)
      (b 2))
  (call-with-current-continuation
   (lambda (k)
     (set! kont k)
     (display 'mutating)
     (newline)
     (set! a -1)
     (set! b -2)))
  (display (+ a b))
  (newline))

Я бы ожидал -3 при оценке LET, но +3 в вызовах kont (поскольку я думал, что программа запомнит привязки a и b перед мутацией):

(let ... ) ; <-- evaluating the LET above
; prints "mutating"
=> -3
(kont 100)
=> -3
(kont 100)
=> -3

То есть продолжение влияет только на контроль, а не на окружающую среду? В этом случае, почему говорится, что один из способов реализации продолжений - это «скопировать стек» (разве нет привязок в стеке?)

Ответы [ 2 ]

3 голосов
/ 14 мая 2011

Продолжение фиксирует привязки.Однако, как вы и предполагаете, эти привязки изменчивы.

Вы были несколько введены в заблуждение здесь лозунгом "копирует стек".Хотя это разумный способ думать о call / cc, это еще не все.Во-первых, вы действительно не хотите, чтобы языковая функция показывала, были ли локальные привязки выделены в стеке или нет.

Вместо этого call / cc определяется с использованием понятия "программные контексты".Чтобы хорошо с этим справиться, вы, возможно, захотите взглянуть на учебник Шрирама Кришнамурти (бесплатно, онлайн) PLAI или на книгу (несвободная, гораздо более углубленную) «Разработка семантики сPLT Redex ".

в сторону;ваша программа на самом деле не проверяет то, что вы хотели проверить, потому что вы никогда не вызывали захваченное продолжение.Я думаю, что вы хотели написать что-то вроде этого:

#lang racket

(define kont #f)

(let ([a 3])

  (let/cc k
    (set! kont k)
    (set! a 4))
  (printf "~s\n" a))

(kont)

... которое демонстрирует почти то же поведение, которое вы упомянули выше.

1 голос
/ 14 мая 2011

Вы изменяете значения a и b в среде с помощью set !.Таким образом, a и b равны -1 и -2 в среде продолжения.Вы не можете развернуть побочные эффекты.В вашем продолжении нет различий между a, b и kont.

...