aboutsummaryrefslogtreecommitdiff
path: root/macros.lisp
diff options
context:
space:
mode:
authorColin Okay <cbeok@protonmail.com>2020-08-13 10:38:30 -0500
committerColin Okay <cbeok@protonmail.com>2020-08-13 10:38:30 -0500
commite8c0f8e58b0039d8d3ed886654a5452168168436 (patch)
tree5e9034a3b8cee68a4dad8bb3d35e8ae3a3f457b3 /macros.lisp
parent61c06fc10ee2bad8d810d342a707677ede2c5f78 (diff)
removed replaced $and $or with macros; added reader macro for $$
Diffstat (limited to 'macros.lisp')
-rw-r--r--macros.lisp38
1 files changed, 32 insertions, 6 deletions
diff --git a/macros.lisp b/macros.lisp
index bbc7f4a..37d111e 100644
--- a/macros.lisp
+++ b/macros.lisp
@@ -21,12 +21,7 @@
(defun numerically-before-p (a b)
(apply #'<
(mapcar (lambda (x) (parse-integer (symbol-name x) :start 1 :junk-allowed t))
- (list a b))))
- )
-
-
-
-
+ (list a b)))))
(defmacro $$ (expr)
"Quickly create functions from an expression EXPR with 'blanks' in
@@ -99,3 +94,34 @@ those numbers.
+(defmacro and> (&rest preds)
+ (let ((block-label (gensym)))
+ `(let ((preds (list ,@preds)))
+ (lambda (arg)
+ (block ,block-label
+ (unless preds (return-from ,block-label t))
+ (let (acc)
+ (dolist (p preds)
+ (setf acc (funcall p arg))
+ (unless acc (return-from ,block-label nil)))
+ acc))))))
+
+(defmacro or> (&rest preds)
+ (let ((block-label (gensym)))
+ `(let ((preds (list ,@preds)))
+ (lambda (arg)
+ (block ,block-label
+ (unless preds (return-from ,block-label nil))
+ (let (acc)
+ (dolist (p preds)
+ (setf acc (funcall p arg))
+ (when acc (return-from ,block-label acc)))
+ acc))))))
+
+
+(set-dispatch-macro-character
+ #\# #\$
+ (lambda (stream subchar arg)
+ (declare (ignore arg subchar))
+ (let ((form (read stream)))
+ (list '$$ form))))