有人知道if和or方案之间的区别是什么,或者为什么我不能使用if代替或作为标识符吗?我在下面发布了一些代码。 谢谢!
;if definition
(define heiner-or
(lambda (test-1 test-2)
(if test-1
#t
test-2)))
;or definition
> (heiner-or (= 10 10) (> 2 5))
#t
> (heiner-or (> 23 42) (< 5 2))
#f
答案 0 :(得分:2)
看看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
,而真实的{{1} }仅评估所需的表达式,直到找到or
值为止-这就是我们所说的短路评估。要了解我的意思,请尝试以下操作:
true
我们无法真正将(or 42 (/ 1 0))
=> 42
(my-or 42 (/ 1 0))
=> /: division by zero
,or
作为过程来实现,它们是特殊形式,需要在解释器级别使用特殊的评估规则来实现。