可以使用“call / cc”实现“if”吗?

时间:2011-07-29 03:27:47

标签: functional-programming scheme control-flow callcc define-syntax

我被告知“call / cc”可用于实现任意控制流构造,所以我试图使用“call / cc”来实现所有这样的构造,但是我遇到了麻烦。假设我没有“if”,我将如何使用“define-syntax”和“call / cc”来实现它?有可能或者我被误导了吗?我知道如何使用“call / cc”实现无条件跳转,但在机器级别使用分支指令执行条件执行,分支指令的执行取决于处理器的状态位。如果没有这种类型的结构,我看不出它是如何完成的。

2 个答案:

答案 0 :(得分: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本身并没有真正做任何相关的事情......

答案 1 :(得分:2)

您只需使用更高阶的程序即可实施 if 。这是显而易见的未婚教会编码:

IF ? T E === (? (lambda () T) (lambda () F))

TRUE     === (lambda (t _) (t))
FALSE    === (lambda (_ f) (f))

根本不需要延续。 True是一个执行它的第一个参数的二元函数; False是执行它的第二个参数的二元函数。如果是三元函数,通过获得由测试(?)确定的真/假来对它们进行排序,并赋予它两个延迟结果的函数。