Lisp言語において、and
とor
は論理演算子です。以下にそれぞれの使い方を説明します。
andの使い方
and
は、引数の全てが真である場合に真を返します。以下は、and
の使用例です。
; x, y, zが全て真の場合に真を返す (and x y z) ; リストの要素が全て真の場合に真を返す (and 1 2 3) ; => 3 (and 1 () 3) ; => ()
andの短絡評価
注意点として、Lispにおいてandは短絡評価を行います。つまり、最初に偽となる値が見つかった時点で評価を中断し、その値を返します。このため、andに渡す式の順序によって結果が変わることがあります。
; xがnilでなく、xの長さが5以上の場合に"long enough"を返す (defun check-length (x) (and x (>= (length x) 5) "long enough")) (check-length "hello") ; => "long enough" (check-length "hi") ; => nil (check-length nil) ; => nil
この例では、check-length
という関数を定義し、引数x
がnil
でなく、かつその長さが5以上の場合に"long enough"を返すようにしています。and
を使って、x
がnil
である場合には短絡評価によりすぐにnil
が返され、>=
演算子を評価することが避けられています。また、and
の後ろに文字列"long enough"を指定することで、最後の式が真である場合にのみ、この文字列が返されるようにしています。
orの使い方
or
は、引数のいずれかが真である場合に真を返します。以下は、or
の使用例です。
; x, y, zのいずれかが真の場合に真を返す (or x y z) ; リストの要素のいずれかが真の場合に真を返す (or () 2 3) ; => 2 (or () () ()) ; => ()
注意点として、Lispにおいてand
とor
は短絡評価を行います。つまり、and
の場合は最初に偽となる値が見つかった時点で評価を中断し、その値を返します。一方、or
の場合は最初に真となる値が見つかった時点で評価を中断し、その値を返します。このため、and
やor
に渡す式の順序によって結果が変わることがあります。
lispで「偽」と判定されるもの
Lispにおいて、「偽」は通常、論理値 false
を表します。Lispでは、以下の値が false
と見なされます。
nil
:nil
は Lispにおいて特別な値で、空のリストを表します。nil
は論理的にfalse
とみなされます。- 数値: 数値のうち、
0
はfalse
とみなされます。正の整数や負の整数はtrue
とみなされます。 - 空の文字列: 空の文字列は
false
とみなされます。 - その他の値: 上記以外のすべての値は
true
とみなされます。
例えば、以下のようなLispのコードがある場合、
(if nil "This will not be printed" "This will be printed")
if
文の条件式が nil
であるため、 false
と見なされます。したがって、上記のコードでは、2番目の引数が返され、結果として "This will be printed"
が表示されます。