方案-if和or之间的差异

时间:2018-11-16 08:29:42

标签: functional-programming scheme

有人知道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

1 个答案:

答案 0 :(得分:2)

看看ifor的文档。 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作为过程来实现,它们是特殊形式,需要在解释器级别使用特殊的评估规则来实现。