首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案-如果与或

方案-如果与或
EN

Stack Overflow用户
提问于 2018-11-16 08:29:41
回答 1查看 71关注 0票数 1

有人知道if和in what之间有什么区别吗?或者为什么我不能使用if替换或者作为标识符?我在下面贴了一些代码。谢谢!

代码语言:javascript
复制
;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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-16 09:07:38

看看ifor的文档。if用于测试一个条件,并且只执行两个可能值中的一个--如果条件为true,第一部分将被执行,如果是false,则执行第二部分:

代码语言:javascript
复制
(if (= 1 0)
    "not executed"
    "executed")
=> "executed"

or是一个可以接收多个参数的逻辑连接器,它将返回它找到的第一个非假值,如果所有值都为false,则返回false。通常使用or连接布尔表达式,但情况并不总是这样:

代码语言:javascript
复制
(or #f 7 10)
=> 7

(or (= 1 0) (= 1 2))
=> #f

还请记住,在Scheme中,所有值都被认为是true,但#f除外,它是false。关于您问题的最后一部分:是的,您可以使用if模拟or,如下所示:

代码语言:javascript
复制
; equivalent to (or value1 value2)
(if value1
    value1
    value2)

以上是一个简化,因为理想情况下,我们应该精确地计算value1一次,也因为这个版本不支持多个参数。但是要小心:一旦你试图把它写成一个程序,你就会遇到麻烦!

代码语言:javascript
复制
(define (my-or value1 value2)
  (if value1
      value1
      value2))

这将不能作为一个or,该过程在计算if之前对两个参数进行评估,而真正的or只计算所需的表达式,直到它找到一个true值--这就是我们所说的短路评估。为了明白我的意思,试试这个:

代码语言:javascript
复制
(or 42 (/ 1 0))
=> 42
(my-or 42 (/ 1 0))
=>  /: division by zero

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53334040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档