我被告知“call / cc”可用于实现任意控制流构造,所以我试图使用“call / cc”来实现所有这样的构造,但是我遇到了麻烦。假设我没有“if”,我将如何使用“define-syntax”和“call / cc”来实现它?有可能或者我被误导了吗?我知道如何使用“call / cc”实现无条件跳转,但在机器级别使用分支指令执行条件执行,分支指令的执行取决于处理器的状态位。如果没有这种类型的结构,我看不出它是如何完成的。
答案 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是执行它的第二个参数的二元函数。如果是三元函数,通过获得由测试(?)确定的真/假来对它们进行排序,并赋予它两个延迟结果的函数。