Reputation: 1223
I am new to Lisp so this might be so simple but I am curious to know about this in any case.
I am familiar with logical operators like AND and OR but lisp does not seem to behave as expected.
For example, For (and 1 8)
Expected:
1 => 0 0 0 1
8 => 1 0 0 0
(and 1 8) => 0 0 0 0
Received:
So, the answer should have been 0
...but instead it is 8
Questions:
Upvotes: 7
Views: 3142
Reputation: 48765
In programming languages there are often two types of and
and or
operator. The Conditional Operators are called &&
and ||
in Algol languages and in Common Lisp they are called and
and or
. On the other hand the arithmetic operators &
, and |
have CL equivalents logand
and logior
.
In Common Lisp every value are booleans and with the exception of nil
every other value is considered a true value. Perl is very similar except it has a couple of false values, however 1
and 8
are true values in both languages:
1 && 8 # ==> 8
1 & 8 # ==> 0
1 || 8 # ==> 1
1 | 8 # ==> 9
Same in CL
(and 1 8) ; ==> 8
(logand 1 8) ; ==> 0
(or 1 8) ; ==> 1
(logior 1 8) ; ==> 9
Upvotes: 6
Reputation: 782105
In Common Lisp, AND
and OR
operate on boolean values, not binary digits. NIL
is the only false value, anything else is considered true.
To operate on the binary representation of numbers, use LOGAND
, LOGIOR
, etc. These are all documented at http://clhs.lisp.se/Body/f_logand.htm.
(logand 1 8) ==> 0
Upvotes: 10