我是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
问题:
- LISP中的计算是如何进行的?
- LISP中逻辑运算符与其他语言有何不同?
我是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
问题:
AND
和OR
操作的是布尔值,而不是二进制数字。只有NIL
被视为假,其他任何值都被视为真。若要操作数字的二进制表示,请使用LOGAND
,LOGIOR
等函数。这些函数在http://clhs.lisp.se/Body/f_logand.htm文档中有详细说明。(logand 1 8) ==> 0
and
和or
运算符。条件运算符在Algol语言中被称为&&
和||
,在Common Lisp中被称为and
和or
。另一方面,算术运算符&
和|
具有CL等效的logand
和logior
。nil
之外,其他所有值都被视为真值。Perl非常相似,只是它有几个假值,但是在这两种语言中,1
和8
都是真值。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
#
进行注释,而不是 //
。 - kmkaplan
(logand 1 8)
是0。 - stark1和8
也是8
,而1 && 8
在Java中会出错。在C++中,1 && 8
是true
。在Ruby中,1 and 8
是1
。在JavaScript中,1 && 8
是8
。 - molbdnilo