我正在使用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)
答案 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)
and
和or
也是控制流操作符
您可以考虑特殊控制流操作符的and
和or
。他们不起作用。函数and
将评估其参数,然后可能返回 true 或 false 。
在这种情况下,and
和or
不是函数,在某些情况下不会评估每个参数:
or
会在看到 true 值and
会在看到 false 值返回值
当有一个值时,两者都会返回 true 值:
or
返回第一个 true 值and
返回最后一个 true 值,当所有参数都是 true 由于 true 不仅意味着单个布尔值,而且大多数其他对象也是 true ,因此您会看到它在您的情况下返回一个列表。只有#f
不是 true 。
其他条件控制流程运算符
例子如下: