有人告诉我“call/cc”可用于实现任意控制流构造,所以我尝试使用“call/cc”来实现所有此类构造,但我遇到了麻烦。假设我没有“if”,我将如何使用“define-syntax”和“call/cc”来实现它?有可能还是我被误导了?我知道如何使用“call/cc”实现无条件跳转,但在机器级别,条件执行是使用分支指令执行的,分支指令的执行取决于处理器的状态位。如果没有这种类型的构造,我看不到它是如何完成的。
问问题
334 次
2 回答
8
你不能——你必须有某种方法来测试事物并根据它们的真假采取行动。不过,您可以通过布尔值的一些功能表示来接近。例如,使用常见的教堂编码:
(define (true x y) x)
(define (false x y) y)
现在您可以将测试(返回这些编码的布尔值之一)视为接受“成功”延续和“失败”延续的函数,并使用它继续:
(define (if c x y) (c x y))
如果你想对此进行试验,你需要考虑到 Scheme 不是一种惰性语言这一事实,所以你需要把事情做好。例如:
(define (true x y) (x))
(define (false x y) (y))
(define-syntax if
[(if c x y) (c (lambda () x) (lambda () y))])
(但您仍然需要修改现有谓词等以返回这些布尔值。)
无论哪种方式,call/cc
它本身并没有真正做任何相关的事情......
于 2011-07-29T03:40:50.570 回答
2
您可以仅使用高阶过程来实现if 。这是明显的 uncurried Church 编码:
IF ? T E === (? (lambda () T) (lambda () F))
TRUE === (lambda (t _) (t))
FALSE === (lambda (_ f) (f))
你根本不需要延续。True 是执行第一个参数的二进制函数;False 是执行它的第二个参数的二进制函数。If 是一个三元函数,通过获取由测试 (?) 确定的真/假,并给它两个延迟结果的函数,将它们排序在一起。
于 2012-11-17T18:38:49.157 回答