嵌套定界连续转换

时间:2019-01-05 08:55:28

标签: scheme racket continuations delimited-continuations

我试图理解定界的连续性,而我正在阅读本文:

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 :(得分:3)

看看该页面上的脚注:

  

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

作为最终结果。