我有点理解如何将基本函数(如算术)在Scheme中转换为延续传递风格。
然而,如果函数涉及递归怎么办?例如:
(define funname
(lambda (arg0 arg1)
(and (some procedure)
(funname (- arg0 1) arg1))))
请给我一些建议。 提前感谢您。
我有点理解如何将基本函数(如算术)在Scheme中转换为延续传递风格。
然而,如果函数涉及递归怎么办?例如:
(define funname
(lambda (arg0 arg1)
(and (some procedure)
(funname (- arg0 1) arg1))))
请给我一些建议。 提前感谢您。
(define (func x y k)
(some-procedure
(lambda (ret)
(if ret
(- x 1
(lambda (ret)
(func ret y k)))
(k #f))))
你缺少一个基本情况,这就是为什么唯一显式调用 continuation 的方法是 (k #f)
。如果你有一个基本情况,那么你也会将基本情况的返回值传递给 continuation。例如:
(define (func x y k)
(zero? x
(lambda (ret)
(if ret
(k y)
(some-procedure
(lambda (ret)
(if ret
(- x 1
(lambda (ret)
(func ret y k)))
(k #f))))))))
这部分内容有点重复了Chris Jester-Young的回答,但是希望我能更好地解释一下 :-).
在CPS中,你要寻找的区别大致是这两种情况:
后者就是Chris示例中的lambda所做的事情。基本上,评估一个lambda会创建一个closure——这些closures用于执行直接样式程序中堆栈帧的相同工作。在堆栈帧中的返回地址的位置,闭包包含一个连续函数的绑定,闭包的代码调用该绑定。