about summary refs log tree commit diff
path: root/third_party/lisp/alexandria/features.lisp
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2020-01-17T18·04+0000
committerVincent Ambo <tazjin@google.com>2020-01-17T18·04+0000
commit0a9a56953435382fa00357efb489860cee600a58 (patch)
treef7d6f418a93b5a8b1a94fe43742f48241c48daac /third_party/lisp/alexandria/features.lisp
parent30e4e5eefcd65c6fc1a3f37a90822ab1041576e0 (diff)
parent95aeb2ebae32a01ff79644daa523bda5d8552863 (diff)
Merge commit '95aeb2ebae32a01ff79644daa523bda5d8552863' as 'third_party/lisp/alexandria' r/394
Diffstat (limited to 'third_party/lisp/alexandria/features.lisp')
-rw-r--r--third_party/lisp/alexandria/features.lisp14
1 files changed, 14 insertions, 0 deletions
diff --git a/third_party/lisp/alexandria/features.lisp b/third_party/lisp/alexandria/features.lisp
new file mode 100644
index 0000000000..67348dbba4
--- /dev/null
+++ b/third_party/lisp/alexandria/features.lisp
@@ -0,0 +1,14 @@
+(in-package :alexandria)
+
+(defun featurep (feature-expression)
+  "Returns T if the argument matches the state of the *FEATURES*
+list and NIL if it does not. FEATURE-EXPRESSION can be any atom
+or list acceptable to the reader macros #+ and #-."
+  (etypecase feature-expression
+    (symbol (not (null (member feature-expression *features*))))
+    (cons (check-type (first feature-expression) symbol)
+          (eswitch ((first feature-expression) :test 'string=)
+            (:and (every #'featurep (rest feature-expression)))
+            (:or  (some #'featurep (rest feature-expression)))
+            (:not (assert (= 2 (length feature-expression)))
+                  (not (featurep (second feature-expression))))))))