Lisp - 逻辑运算符

Lisp - Logical operators

我是 Lisp 的新手,所以这可能很简单,但无论如何我都很想知道这个。

我熟悉 AND 和 OR 等逻辑运算符,但 lisp 的行为似乎与预期不符。

例如,对于 (and 1 8)

预期:

1 => 0 0 0 1
8 => 1 0 0 0
(and 1 8) => 0 0 0 0

收到: 所以,答案应该是 0 ...而是 8

问题:

  1. 这个计算在 LISP 中是如何完成的?
  2. 是逻辑运算符 LISP 有根本不同?

在 Common Lisp 中,ANDOR 对布尔值而不是二进制数字进行运算。 NIL 是唯一的错误值,其他任何值都被认为是正确的。

要对数字的二进制表示进行操作,请使用 LOGANDLOGIOR 等。这些都记录在 http://clhs.lisp.se/Body/f_logand.htm

(logand 1 8) ==> 0

在编程语言中通常有两种运算符andor。条件运算符在 Algol 语言中称为 &&||,在 Common Lisp 中它们称为 andor。另一方面,算术运算符 &| 具有 CL 等价物 logandlogior.

在 Common Lisp 中,每个值都是布尔值,除了 nil 之外的所有其他值都被认为是真值。 Perl 非常相似,只是它有几个假值,但是 18 在两种语言中都是真值:

1 && 8 # ==> 8
1 & 8  # ==> 0
1 || 8 # ==> 1
1 | 8  # ==> 9

CL 中相同

(and 1 8)    ; ==> 8
(logand 1 8) ; ==> 0
(or 1 8)     ; ==> 1
(logior 1 8) ; ==> 9