1

上下文:我目前正在编写一个小型方案编译器,并采取了先转换为管理范式,然后转换为 cps 的方法(我发现这是最容易理解的,因为它们的工作有明确的分离)。

问题:CPS 仅将延续用于非基元而不用于基元。我真的不明白这与能够正确脱糖 call/cc 等之间的联系。为每个调用/cc 简单地创建一个代表延续的 lambda 还不够吗?为什么我们对所有非原始对象使用延续/我是否错误地认为 CPS 是能够对调用/cc 脱糖的必要条件?

例子:

(+ 2 (call/cc (lambda (k) (k 2))))

变成 (anf)

(let ((v1 (call/cc (lambda (k) (k 2)))))
    (+ 2 v1))

变为(继续通话/抄送以及脱糖)

((λ (f cc) (f (λ (x _) (cc x)) cc)) (lambda (k cont) (k 2))
   (lambda (v1) ((lambda (x) (display-or-whatever x)) (+ 2 v1)))))

我认为这种方法通常有效。

4

0 回答 0