OR/AND 对 Racket 中列表的操作

OR/AND operation on lists in Racket

我想了解 andor 在 Racket 中与列表一起使用时代表什么。当我做这样的事情时 -

> (or `(1 2) `(1 3))
'(1 2)

结果代表什么?我想当我们使用 or 和两个列表时,我们会得到列表的并集。这显然不是这里发生的事情。所以,我认为它被解释为布尔值,这就是为什么 `(1 2) 不是假值。因此,结果是`(1 2)。但是这个呢? -

> (and `(1 2) `(1 3))
'(1 3)

我该如何证明这一点?

or 正在寻找第一个真值,从左到右检查参数。 #false 以外的每个值都是真实的。如果找到任何内容,则会 returned。在您的示例中,'(1 2) 是从左边开始的第一个真值,因此它是 returned.

Or 调用时没有参数 returns #false,因为没有找到真值:

> (or)
#f

And 检查是否所有值都为真,因此它必须检查所有值,从左到右,并且它可以 return #false (如果有 #false 被发现)或者,如果所有值都是真实的,最后一个。在您的示例中,'(1 3) 是最后一个真值,因此它是 returned.

And 调用时没有参数 returns #true,因为没有找到 #false

> (and)
#t

另请阅读有关 or and and 的文档。

顺便说一句,'`是有区别的。第一个是 quote, the second one is quasiquote。在这个例子中,这并不重要,但您应该知道它们之间的区别。 如果您真的在寻找联合函数,请检查 racket/set library:

(require racket/set)
(set-union (set 1 2) (set 1 3))
=> (set 1 3 2)