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" が表示されます。
page:https://minegishirei.hatenablog.com/entry/2023/04/24/093206