Делает ли продолжение запись состояний ПК и регистров?

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

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

; 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.

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


person Community    schedule 28.03.2011    source источник


Ответы (1)


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

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

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

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

(+ 3 (f [hole]))

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

Call-with-current-continuation captures one of these contexts. Invoking a continuation causes the replacement of the current context with the one stored in the continuation.

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

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

person John Clements    schedule 28.03.2011
comment
Хороший указатель! и я обязательно изучу этот материал позже. Кстати, основная причина, по которой я склонен так думать, заключается в том, что когда ПК возобновляется до записанного, тогда поток программы будет изменен, и оттуда продолжится выполнение оставшихся вычислений. - person ; 29.03.2011
comment
Отличное описание продолжений. - person Jake; 29.03.2011
comment
Я изучил call/cc, способ выполнения: он захватывает текущее продолжение (cc), которое содержит текущие среды (локальные или глобальные, или мыслите как регистровые файлы) и место захвата cc, затем cc привязывается к переменная в лямбда-терминах, когда cc вызывается, поток кода вернется к тому месту, где он был захвачен (подумайте, что это ПК, записанный ранее), и вернет то значение, которое передается в cc (если значение не передано , точка выполнения просто вернется на записанный ПК и будет выполняться оттуда). Это яснее с другим бесконечным циклом также в блоге Майта. - person ; 30.03.2011
comment
Пример, о котором я упоминал выше: (let ((start #f)) (if (not start) (call/cc (lambda (cc) (set! start cc)))) (display "Going to invoke (start)\n") (start)) - person ; 30.03.2011