diff options
author | Colin Okay <okay@toyful.space> | 2020-12-13 12:05:05 -0600 |
---|---|---|
committer | Colin Okay <okay@toyful.space> | 2020-12-13 12:05:05 -0600 |
commit | 2c2047aef8930f0c5d1f1c5ac441a7c5ddebf236 (patch) | |
tree | e9d542cbc85b77b570c1337341ada05636eb478f | |
parent | 8978d58be4d6798c56cb00016fd1e65460e10434 (diff) |
exit-function and exit-value in binding>
-rw-r--r-- | macros.lisp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/macros.lisp b/macros.lisp index 6630946..b2fcf1e 100644 --- a/macros.lisp +++ b/macros.lisp @@ -174,7 +174,7 @@ printed. But the next time only the return value is used. -(defmacro binding> ((&key (exit-when #'null) (exit-with #'identity)) init &rest functions) +(defmacro binding> ((&key (exit-when #'null) exit-value exit-function) init &rest functions) "A threading macro. Some examples: (binding> () @@ -189,17 +189,22 @@ should return \"the big idea\" #$(values (search \"NOOOOOOPE\" $s) $s) #$(subseq $2 $1)) -should return \"☹\". +should return (\"☹\") EXIT-WHEN should be a function, a predicate, that operates on the -first value returned from one of the forms. If non-NIL, the BINDING> -form returns by calling the EXIT-WITH function on the list of values -returned the the most recently called function. +first value returned from one of the forms. If EXIT-WHEN returns +non-NIL, then the form exits early. + +If EXIT-FUNCTION is non-NIL it is expected to be a function that +accepts a list, the list of values returned from the last function in +the chain. + +If EXIT-FUNCTION is NIL, then EXIT-VALUE is returned instead. e.g (binding> (:exit-when #'evenp - :exit-with #$(list* :failed $x)) + :exit-function #$(list* :failed $x)) 33 #$(+ 11 $x) #$(- 5 $x)) @@ -207,7 +212,6 @@ e.g will return (:FAILED 44) The default value of EXIT-WHEN is the predicate NULL. -The default value of EXIT-WITH is IDENTITY " (let ((vals (gensym)) @@ -218,7 +222,9 @@ The default value of EXIT-WITH is IDENTITY (dolist (,fn (list ,@functions) (values-list ,vals)) (setq ,vals (multiple-value-list (apply ,fn ,vals))) (when (funcall ,exit-when (car ,vals)) - (return-from ,block-label (funcall ,exit-with ,vals)))))))) + (return-from ,block-label + (if ,exit-function (funcall ,exit-function ,vals) + ,exit-value)))))))) |