From cc53e6ec42316262e9ad87230cb6892949d7a42b Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Wed, 19 Feb 2025 07:18:52 +0000 Subject: Implement -<> operator for threading an argument through first parameter --- lib/macros.lisp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'lib/macros.lisp') diff --git a/lib/macros.lisp b/lib/macros.lisp index cb11901..e82d566 100644 --- a/lib/macros.lisp +++ b/lib/macros.lisp @@ -63,6 +63,26 @@ Like the `|>' operator in Ocaml." :do (setq acc (append canon-func (list acc))) :finally (return acc)))) + +(defmacro -<> (&rest forms) + "Make current form the first argument of the next form, returning the last + form. + +i.e. +(-<> (a1 a2...) (b1 b2...) (c1 c2...)) == (c1 (b1 (a1 a2 ...) b2 ...) c2 ...) + +Also includes transformer where symbols are considered unary functions. + +Like the `|>' operator in Ocaml." + (if (null forms) + nil + (loop :with acc = (car forms) + :for func :in (cdr forms) + :for canon-func = (if (symbolp func) (list func) func) + :do (push acc (cdr canon-func)) + :do (setq acc canon-func) + :finally (return acc)))) + (defmacro while (condition &body body) `(loop :while ,condition :do -- cgit v1.2.3-13-gbd6f