我试图理解定界的连续性,而我正在阅读本文:
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)
)。
答案 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)))
作为最终结果。