cps - 代码

代码:


(letrec ((f (lambda (x) (cons 'a x)))
         (g (lambda (x) (cons 'b (f x))))
         (h (lambda (x) (g (cons 'c x)))))
  (cons 'd (h '())))

;传递为向后传递,而不是向前传递
;向后传递(f x k),或者是(f x (lambda (v) ... ))
;向前传递(k (f x)),或者是((lambda (v) ... ) (f x))
;把k一层一层传递下去,k为 top level的
(letrec ((f (lambda (x k) (k (cons 'a x))))
         (g (lambda (x k) (f x (lambda (v) (k (cons 'b v))))));将(f x)的结果v,与'b cons起来,即(cons 'b v),传递给调用者k
         (h (lambda (x k) (g (cons 'c x) k)))) ;将g的调用结果传递给k,也就是(lambda (v) (k v)),可以简写为k
  (h '() (lambda (v) (cons 'd v)))) ;将h的调用结果v,与'd cons起来传递给调用者k,此处已经是top leve了,所以直接cons起来就可以了



;比如将加法改成cps的形式
;因为内置的+为两个参数,所以不适用cps的形式,因此可以自定义一个适用cps形式的加法,假设为cps+
(define cps+
  (lambda (x y k) ;将两个参数变成三个参数
    (k (+ x y)))) ;因为(+ x y)中没有调用其他函数,所以不是(+ x y k),而是(k (+ x y))

;停机函数halt为
(lambda (v)
  v)

(+ 1 (+ 2 3))
;的cps的形式
(cps+ 2 3 (lambda (v)
            (+ 1 v))) ;此处只有(+ 2 3)使用了cps,(+ 1 ... ) 没有使用cps

(cps+ 2 3 (lambda (v)
            (cps+ 1 v (lambda (v1) v1)))) ;完全使用了cps

(cps+ 2 3 (lambda (v)
            (+ 4 (cps+ 1 v (lambda (v1) v1)))))














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值