Продолжаете ли записывать ПК и регистрировать состояния? - PullRequest
0 голосов
/ 28 марта 2011

В настоящее время, когда я экспериментирую с продолжением на функциональных языках, я понимаю, что продолжение записывает текущий счетчик программы и файлы регистров, а когда возвращается продолжение, то ПК и зарегистрированные файлы будут восстановлены до значений он записал.

Итак, в следующем тупом примере из сообщения в блоге Might ,

; right-now : -> moment
(define (right-now)
  (call-with-current-continuation 
   (lambda (cc) 
     (cc cc))))

; go-when : moment -> ...
(define (go-when then)
  (then then))  


; An infinite loop:
(let ((the-beginning (right-now)))
  (display "Hello, world!")
  (newline)
  (go-when the-beginning))  ; here the-beginning continuation passed to go-when, which ultimately will have an continuation applied to an continuation, that returns a continuation, which will cause the the program point resumed to the PC and registers states recorded in it.

Я не уверен, что мое понимание верно .. Пожалуйста, поправьте меня, если вы думаете, что нет .....

1 Ответ

8 голосов
/ 28 марта 2011

Программный счетчик и регистр файлов не являются продолжением записи.

Лучший способ описать значение вызова с текущим продолжением - это запись программы context .Например, предположим, что вы оцениваете программу

(+ 3 (f (call-with-current-continuation g)))

. В этом случае context выражения продолжения вызова с текущим значением будет

(+ 3 (f [hole]))

То есть материал, окружающий текущее выражение.

Вызов с текущим продолжением фиксирует один из этих контекстов.Вызов продолжения вызывает замену текущего контекста тем, который хранится в продолжении.

Идея контекста очень похожа на идею стека , за исключением того, что в этом нет ничего особенноговызовы функций в контекстах.

Это очень короткое обращение.Я настоятельно призываю вас взглянуть на книгу Шримама Кришнамурти (бесплатно, онлайн) PLAI , в частности на часть VII, для более подробного и внимательного изучения этой темы.

...