Вложенные разграничения продолжения преобразований
Я пытаюсь понять продолжения с разделителями, и я читал эту статью:
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)))
как конечный результат.