以连续传递方式转换协程

时间:2017-08-19 09:09:20

标签: scheme coroutine continuations callcc

我有这个协程示例

(define p1
  (lambda (continuation)
    (display "1")
    (newline)
    (p1 (call/cc continuation))))

(define p2
  (lambda (continuation)
  (display "2")
  (newline)
  (p2 (call/cc continuation))))

(p1 p2)

我想在CPS中更改它,以便我可以使用CPS呼叫/ cc:

(define (call/cc-cps f continuation)
  (define (exit value actual-continuation)
    (continuation value))
  (f exit continuation))

我知道要在CPS中转换一个函数,我需要在函数中添加一个延续,但我很困惑,而且我真的不知道如何去做。

我认为它看起来像那样:

 (define p1
   (lambda (continuation)
   (display "2")
   (newline)
   (call/cc-cps
     (lambda (continuation actual-continuation)
       continuation) ;; or actual-continuation ?
     (lambda (value)
       (p1 value)))))

(p1 p2)

但这可能是错的。有人可以帮我理解如何正确地做到这一点吗?

谢谢

1 个答案:

答案 0 :(得分:1)

如果您在CPS中执行某些操作,则只在每个函数的尾部位置进行一次计算。这是解释器评估代码的方式:

(define (hyp a b)
  (sqrt (+ (square a) (square b))))

重点是CPS按所需顺序进行计算,并且一次不做多件事。这在CPS中变为:

(define (hyp& a b cont)
  (define (cont-square-a sqa)
    (define (cont-square-b sqb)
      (define (cont-sum sum)
        (sqrt& sum cont))          
      (+& sqa sqb cont-sum))        
    (square& b cont-square-b))      
  (square& a cont-square-a))

或者如果您更喜欢匿名延续:

(define (hyp& a b cont)      
  (square& a
           (lambda (sqa)
             (square& b
                      (lambda (sqb)          
                        (+& sqa
                            sqb
                            (lambda (sum)
                              (sqrt& sum cont))))))))

所有& -functions只是实际函数的CPS版本,因此除了原始函数之外,它们还有一个continuation参数。 p1看起来像这样:

(define (p1& continuation& cont)
  (define (cont-display-2 undefined-value-1)
    (define (cont-newline undefined-value-2)
      (define (cont-call-cc-continuation& continuation-value)
        (p1& continuation-value cont))
      (call/cc& continuation& cont-call-cc-continuation&))
    (newline& cont-newline))
   (display& "2" cont-display-2))

您可能对Matt Might的文章感兴趣。在连续性和汇编周围的所有内容中获取战利品,因为它们是相关的。我还建议观看SICP videos并尝试解决SICP book中的练习。当你在制作口译员和编制者时,它应该是在公园里散步,制作发电机。