我在方案中找到了关于特殊功能“或”的问题:
Joe Hacker大声说没有理由或者Scheme中需要特殊 - 它可以由程序员定义,如下所示:
乔是对的吗?(define (or x y) (if x #t y))
我无法弄清楚为什么不应该这样做。
有些计划专家可以解释一下这是否有效,如果没有:为什么不呢?
答案 0 :(得分:13)
这是因为or
的这个版本会评估它的所有参数(因为它是一个函数),而标准的Scheme or
(它不是一个函数,但是特殊的语法)却没有。尝试在Scheme REPL上运行(or #t (exit))
,然后尝试使用or
函数。
标准or
的行为有时称为short-circuited:它仅评估它需要的那些参数。这对于跨编程语言的二进制布尔运算符(or
和and
)非常常见。 or
看起来像函数调用这一事实是Scheme / Lisp语法的一个特性,但看起来很有欺骗性。
答案 1 :(得分:1)
它是否有效取决于你想要它做什么。它肯定适用于两个给定的布尔值,它将返回预期的结果。但是它在功能上不等同于常规or
,因为它不会短路,即如果你的定义(or #t (/ 0 0))
会导致错误,因为你在使用常规{{1}时将0除以0它只会返回or
而不会尝试评估#t
。