diff options
author | Colin Okay <cbeok@protonmail.com> | 2020-08-13 10:38:30 -0500 |
---|---|---|
committer | Colin Okay <cbeok@protonmail.com> | 2020-08-13 10:38:30 -0500 |
commit | e8c0f8e58b0039d8d3ed886654a5452168168436 (patch) | |
tree | 5e9034a3b8cee68a4dad8bb3d35e8ae3a3f457b3 /macros.lisp | |
parent | 61c06fc10ee2bad8d810d342a707677ede2c5f78 (diff) |
removed replaced $and $or with macros; added reader macro for $$
Diffstat (limited to 'macros.lisp')
-rw-r--r-- | macros.lisp | 38 |
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)))) |