Lispのandとorの使い方

Lisp言語において、andorは論理演算子です。以下にそれぞれの使い方を説明します。

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という関数を定義し、引数xnilでなく、かつその長さが5以上の場合に"long enough"を返すようにしています。andを使って、xnilである場合には短絡評価によりすぐにnilが返され、>=演算子を評価することが避けられています。また、andの後ろに文字列"long enough"を指定することで、最後の式が真である場合にのみ、この文字列が返されるようにしています。

orの使い方

orは、引数のいずれかが真である場合に真を返します。以下は、orの使用例です。

; x, y, zのいずれかが真の場合に真を返す
(or x y z)

; リストの要素のいずれかが真の場合に真を返す
(or () 2 3) ; => 2
(or () () ()) ; => ()

注意点として、Lispにおいてandorは短絡評価を行います。つまり、andの場合は最初に偽となる値が見つかった時点で評価を中断し、その値を返します。一方、orの場合は最初に真となる値が見つかった時点で評価を中断し、その値を返します。このため、andorに渡す式の順序によって結果が変わることがあります。

lispで「偽」と判定されるもの

Lispにおいて、「偽」は通常、論理値 false を表します。Lispでは、以下の値が false と見なされます。

  • nil: nilLispにおいて特別な値で、空のリストを表します。nil は論理的に false とみなされます。
  • 数値: 数値のうち、 0false とみなされます。正の整数や負の整数は true とみなされます。
  • 空の文字列: 空の文字列は false とみなされます。
  • その他の値: 上記以外のすべての値は true とみなされます。

例えば、以下のようなLispのコードがある場合、

(if nil
    "This will not be printed"
    "This will be printed")

if 文の条件式が nil であるため、 false と見なされます。したがって、上記のコードでは、2番目の引数が返され、結果として "This will be printed" が表示されます。