Lisp - 逻辑运算符

7

我是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中逻辑运算符与其他语言有何不同?

1
在Lisp中,NIL是唯一的假值,其他所有值都是真值。 - Barmar
1
(logand 1 8) 是0。 - stark
1
你正在比较哪些编程语言?在Python中,1和8也是8,而1 && 8在Java中会出错。在C++中,1 && 8true。在Ruby中,1 and 81。在JavaScript中,1 && 88 - molbdnilo
2个回答

10
在Common Lisp中,ANDOR操作的是布尔值,而不是二进制数字。只有NIL被视为假,其他任何值都被视为真。若要操作数字的二进制表示,请使用LOGANDLOGIOR等函数。这些函数在http://clhs.lisp.se/Body/f_logand.htm文档中有详细说明。
(logand 1 8) ==> 0

6
在编程语言中,通常有两种类型的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

请注意,Perl 中使用 # 进行注释,而不是 // - kmkaplan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接