(defun conjoin (&rest predicates)
(case (length predicates)
(0 (constantly t))
(1 (car predicates))
(2 (lambda (&rest args)
(and (apply (first predicates) args)
(apply (second predicates) args))))
(3 (lambda (&rest args)
(and (apply (first predicates) args)
(apply (second predicates) args)
(apply (third predicates) args))))
(t
(lambda (&rest args)
(loop
for p in predicates
for val = (apply p args)
while val
finally (return val))))))Source Context