Вложенные разграничения продолжения преобразований - PullRequest
0 голосов
/ 05 января 2019

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

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 Ответ

0 голосов
/ 05 января 2019

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

[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)))

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

...