リストに対するand/or


Tag: リスト

and マクロや or マクロは引数の一部を評価した段階で値が確定する場合、それ以降の引数の評価を打ち切ります。例えば and マクロで最初の引数が偽だった場合、それ以降の引数の値に関わらず結果は偽となるので、そこで評価が打ち切られます。

;; 第二引数以降は評価されない。
(and nil nil t)

and / or はマクロであるので、 apply を使ってリストに対して適用することはできません。

;; エラー
(apply #'and '(nil nil t))

リストなどのシーケンスに対する and / or を取るには、 everysomenoteverynotany などを使う方法があります。

; (or nil nil t) に相当
(some #'identity '(nil nil t))  
(notevery #'null '(nil nil t))

; (and nil nil t) に相当
(every #'identity '(nil nil t))
(notany #'null '(nil nil t))

ただし、マクロ版と違い、すべての引数が評価されてしまうことに注意が必要です。