Scheme 以连续传递样式转换协同程序
我有一个协同程序的例子Scheme 以连续传递样式转换协同程序,scheme,coroutine,continuations,callcc,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呼叫/抄送: (
(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呼叫/抄送:
(define (call/cc-cps f continuation)
(define (exit value actual-continuation)
(continuation value))
(f exit continuation))
我知道要在CPS中转换函数,我需要在函数中添加一个continuation,但是我很困惑,我真的不知道怎么做
我想它看起来是这样的:
(define p1
(lambda (continuation)
(display "2")
(newline)
(call/cc-cps
(lambda (continuation actual-continuation)
continuation) ;; or actual-continuation ?
(lambda (value)
(p1 value)))))
(p1 p2)
但这可能是错误的。有人能帮我理解如何正确地做吗
谢谢如果您在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))))))))
所有的&-函数都只是实际函数的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))
您可能对的文章感兴趣。在续集和汇编相关的所有东西上抢夺一点。我还建议大家看下练习,也许可以试着在课堂上解决练习。当你制作翻译和编译程序的时候,你应该是在公园里散步制作发电机