Преобразования продолжений с вложенными разделителями

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

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


person jack malkovick    schedule 05.01.2019    source источник


Ответы (1)


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

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

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

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

 (reset E) 
 ; --> 
 E 

So:

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

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

person Sorawee Porncharoenwase    schedule 05.01.2019
comment
Спасибо! в общем... (append-map (lambda (x) (append-map (lambda (y) (list (+ x y))) '(3 4))) '(1 2)) - person jack malkovick; 05.01.2019