Вложенные разграничения продолжения преобразований

Я пытаюсь понять продолжения с разделителями, и я читал эту статью:

http://community.schemewiki.org/?composable-continuations-tutorial

И я нашел это преобразование сброса / сдвига

 (reset (...A... (shift V E) ...B...)) 
 ; --> 
 (let ((V (lambda (x) (...A... x ...B...)))) 
   E)

Например, я попытался преобразовать это выражение (я думаю, что append-map из Racket)

(reset (list (
(lambda (x) (* x x)) (shift k (append-map k '(1 2))) )))

и получил это

(append-map 
(lambda (y) (list ((lambda (x) (* x x)) y))) '(1 2))

с тем же результатом '(1 4)

Мне было интересно, можно ли применить такое же преобразование (которое устранит сброс / сдвиг) к выражению, подобному этому:

(reset (list (+ 
(shift k (append-map k '(1 2))) 
(shift k (append-map k '(3 4))) )))

и как будет выглядеть результат (он оценивает '(4 5 5 6)).

1 ответ

Решение

Взгляните на сноску на этой странице:

[2] Это преобразование не является строго правильным. На самом деле, есть еще несколько перезагрузок, размещенных по всему выходу. Однако детали этого выходят за рамки этого вводного текста, и это уместно только в том случае, если мы будем использовать вложенный сдвиг и сброс.

Для полноты, однако, вот правильное преобразование, если вы хотите:

 (reset (...A... (shift K E) ...B...)) 
 ; --> 
 (let ((K (lambda (x) (reset (...A... x ...B...))))) 
   (reset E)) 

 (reset E) 
 ; --> 
 E 

Так:

(reset (list (+ (shift k (append-map k '(1 2))) (shift k (append-map k '(3 4))))))

трансформируется в:

(let ((k (lambda (x) (reset (list (+ x (shift k (append-map k '(3 4))))))))) 
  (reset (append-map k '(1 2))))

А также

(reset (list (+ x (shift k (append-map k '(3 4))))))

в свою очередь преобразуется в:

(let ((c (lambda (y) (reset (list (+ x y)))))) 
  (reset (append-map c '(3 4)))) 

Используя второе правило для удаления reset, у нас есть:

(let ((k (lambda (x) (let ((c (lambda (y) (list (+ x y))))) 
                       (append-map c '(3 4))) ))) 
  (append-map k '(1 2)))

как конечный результат.

Другие вопросы по тегам