为什么“和”和“或”在收到列表后会提供这些结果?

时间:2016-10-15 03:14:05

标签: list functional-programming lisp racket sicp

我正在使用Racket和Dr. Racket进行教育。

在变量“x”和“y”的以下定义之后:

(define x (list 1 2 3))
(define y (list 4 5 6))

我决定使用这些变量创建3个不同的列表。

首先:

(append x y)

>> '(1 2 3 4 5 6)

第二

(cons x y)

>> '((1 2 3) 4 5 6)

第三

(list x y)

>> ((1 2 3) (4 5 6))

之后,我决定在三个列表中使用布尔运算符“and”和“or”。令我感到惊讶的是输出。为什么会这样?为什么“或”和“和”选择其中一个列表?这个决定背后的比例是多少?

(and (append x y) (cons x y) (list x y))

>> '((1 2 3) (4 5 6))

(or (append x y) (cons x y) (list x y))

>> '(1 2 3 4 5 6)

2 个答案:

答案 0 :(得分:5)

很简单:and如果至少有一个表达式,则返回最后表达式的值 truthy #f是{false},而or返回真实的第一个表达式的值,如果全部为假,则返回#f

记住:在Scheme中,唯一的错误值是#f,而其他任何东西都被认为是真的,因此我们使用绰号" truthy" - 表示非假值。特别是在你的代码中:

(and (append x y) (cons x y) (list x y))

返回最后一个truthy表达式的值:(list x y),而这个:

(or (append x y) (cons x y) (list x y))

返回第一个truthy表达式的值:(append x y)

答案 1 :(得分:4)

andor也是控制流操作符

您可以考虑特殊控制流操作符的andor。他们不起作用。函数and将评估其参数,然后可能返回 true false

在这种情况下,andor不是函数,在某些情况下不会评估每个参数:

  • or会在看到 true
  • 时立即返回
  • and会在看到 false
  • 时立即返回

返回值

当有一个值时,两者都会返回 true 值:

  • or返回第一个 true
  • and返回最后一个 true 值,当所有参数都是 true

由于 true 不仅意味着单个布尔值,而且大多数其他对象也是 true ,因此您会看到它在您的情况下返回一个列表。只有#f不是 true

其他条件控制流程运算符

例子如下:

  • 如果
  • COND
  • 情况下
  • 除非