查看if 和or 的文档。 if 用于测试条件并执行 仅 两个可能值之一 - 如果条件是 true,第一部分将被执行,如果是 false,第二部分将被执行:
(if (= 1 0)
"not executed"
"executed")
=> "executed"
or 是一个可以接收多个参数的logical connector,它将返回它找到的第一个非假值,如果所有值都为假,则返回false。通常你会使用or 来连接布尔表达式,但情况并非总是如此:
(or #f 7 10)
=> 7
(or (= 1 0) (= 1 2))
=> #f
还要记住,在 Scheme 中,所有值都被视为 true,除了 #f,即 false。关于你问题的最后一部分:是的,你可以使用if 来模拟or,它会是这样的:
; equivalent to (or value1 value2)
(if value1
value1
value2)
上面是一个简化,因为理想情况下我们应该只计算一次value1,而且这个版本不支持多个参数。但请注意:当您尝试将其编写为过程时,您会遇到麻烦!
(define (my-or value1 value2)
(if value1
value1
value2))
这将作为or 工作,该过程在评估if 之前评估两个参数,而真正的or 仅评估所需的表达式直到找到true 值——这就是我们所说的短路评估。要明白我的意思,试试这个:
(or 42 (/ 1 0))
=> 42
(my-or 42 (/ 1 0))
=> /: division by zero
我们不能真正将or、if 实现为过程,它们是特殊形式,需要在解释器级别实现,具有特殊的评估规则。