【问题标题】:Scheme - difference between if and or方案 - if 和 or 之间的区别
【发布时间】:2019-04-19 10:00:12
【问题描述】:

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

【问题讨论】:

    标签: functional-programming scheme


    【解决方案1】:

    查看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 之前评估两个参数,而真正的or 仅评估所需的表达式直到找到true 值——这就是我们所说的短路评估。要明白我的意思,试试这个:

    (or 42 (/ 1 0))
    => 42
    (my-or 42 (/ 1 0))
    =>  /: division by zero
    

    我们不能真正将orif 实现为过程,它们是特殊形式,需要在解释器级别实现,具有特殊的评估规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2010-10-30
      • 1970-01-01
      • 2023-01-12
      • 2013-07-26
      • 2011-11-01
      • 2012-05-25
      相关资源
      最近更新 更多