1 (in-package :alexandria
)
3 (defun featurep (feature-expression)
4 "Returns T if the argument matches the state of the *FEATURES*
5 list and NIL if it does not. FEATURE-EXPRESSION can be any atom
6 or list acceptable to the reader macros #+ and #-."
7 (etypecase feature-expression
8 (symbol (not (null (member feature-expression
*features
*))))
9 (cons (check-type (first feature-expression
) symbol
)
10 (eswitch ((first feature-expression
) :test
'string
=)
11 (:and
(every #'featurep
(rest feature-expression
)))
12 (:or
(some #'featurep
(rest feature-expression
)))
13 (:not
(assert (= 2 (length feature-expression
)))
14 (not (featurep (second feature-expression
))))))))