【问题标题】:Nested delimited continuations transformations嵌套分隔的延续转换
【发布时间】:2019-05-31 16:57:15
【问题描述】:

我正在尝试理解定界延续,我正在阅读这篇文章:

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

【问题讨论】:

    标签: scheme racket continuations delimited-continuations


    【解决方案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)))
    

    作为最终结果。

    【讨论】:

    • 谢谢!所以基本上...(append-map (lambda (x) (append-map (lambda (y) (list (+ x y))) '(3 4))) '(1 2))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多