为什么我不能在方案中定义“或 - 函数”?

时间:2011-11-05 14:41:26

标签: scheme

我在方案中找到了关于特殊功能“或”的问题:

  

Joe Hacker大声说没有理由或者Scheme中需要特殊 - 它可以由程序员定义,如下所示:

(define (or x y)
    (if x
        #t
        y))
     乔是对的吗?

我无法弄清楚为什么不应该这样做。

有些计划专家可以解释一下这是否有效,如果没有:为什么不呢?

2 个答案:

答案 0 :(得分:13)

这是因为or的这个版本会评估它的所有参数(因为它是一个函数),而标准的Scheme or(它不是一个函数,但是特殊的语法)却没有。尝试在Scheme REPL上运行(or #t (exit)),然后尝试使用or函数。

标准or的行为有时称为short-circuited:它仅评估它需要的那些参数。这对于跨编程语言的二进制布尔运算符(orand)非常常见。 or 看起来像函数调用这一事实是Scheme / Lisp语法的一个特性,但看起来很有欺骗性。

答案 1 :(得分:1)

它是否有效取决于你想要它做什么。它肯定适用于两个给定的布尔值,它将返回预期的结果。但是它在功能上不等同于常规or,因为它不会短路,即如果你的定义(or #t (/ 0 0))会导致错误,因为你在使用常规{{1}时将0除以0它只会返回or而不会尝试评估#t