論理演算

真偽

AutoLISP関数
(not item)
item:アトム、リスト
指定された項目の真偽値を反転させます。
戻り値:nil、またはnil 以外

not 関数は、item がnil ならばnil 以外を返し、nil 以外ならばnil を返します。

_$ (not nil) ⏎
T
_$ (not T) ⏎
nil

動作は結局 null 関数と同じです。

論理積・和

AutoLISP関数
(and [expr...])
expr:式
複数の式のAND(論理積)を返します。
戻り値:nil、またはnil 以外

and 関数は、すべての expr 式が nil 以外の時に nil 以外を返し、一つでも nil がある場合は nil を返します。

_$ (and T T T) ⏎
T
_$ (and T nil T) ⏎
nil
AutoLISP関数
(or [expr...])
expr:式
複数の式のOR(論理和)を返します。
戻り値:nil、またはnil 以外

or 関数は、expr のどれか一つでも nil 以外の時に nil 以外を返し、すべてが nil である場合だけ nil を返します。

_$ (or nil nil nil) ⏎
nil
_$ (or nil T nil) ⏎
T

XOR (排他的論理和)は以下のような関数で定義できます。

(defun xor (expr1 expr2)
  (or (and (not expr1) expr2)
      (and expr1 (not expr2))
  )
)

遅延評価

and 関数や or 関数の引数の評価の仕方は、他とは少し異なっています。LISP の関数の引数は左側から評価され値が確定したうえで関数が実行されるので、言い換えると、引数の評価がすべて終わるまで関数が実行されません。

しかし、論理積 and は、どれか一つでも偽であれば偽となります。また、論理和 or はどれか一つでも真であれば真になります。そのため、論理積の場合は先に評価した引数が nil だった場合、論理和の場合は先に評価した引数が nil 意外だった場合、以降の引数を評価することは無駄なことになります。and 関数や or 関数は、この無駄な引数の評価を行いません。つまり、引数を左側から評価していくことは同じですが、引数の評価がどれか一つでも結果を決定づけるものが得られた場合、即座に以降の引数の評価をやめて結果を返します。

_$ (and nil (progn (princ "\n Second argument was evaled.") T)) ⏎
nil

このように評価が必要になるまで、and 関数の場合は順に評価している引数がそれまで nil 以外で次の引数を評価する必要になるまで、評価が抑制される仕組みを関数型言語では「遅延評価」といいます。