上下文:我目前正在编写一个小型方案编译器,并采取了先转换为管理范式,然后转换为 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)))))
我认为这种方法通常有效。