From b29855047be9a172d570db71600425b2b06a8a59 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Mon, 10 Feb 2025 07:14:05 +0000 Subject: Implement `$` operator, second class version of the applicative operator The `$` operator takes a sequence of FORMS and returns a unary function which applies the input through that sequence via the `->>` operator. For example, consider the predicate "not null". `null` is built into Common Lisp but "not null" requires writing a function (lambda (x) (not (null x))). Now, using this operator, you can write ($ not null) which returns the same lambda as above while being more concise. --- lib.macros.lisp | 6 ++++++ packages.lisp | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib.macros.lisp b/lib.macros.lisp index 5489564..f02e7a2 100644 --- a/lib.macros.lisp +++ b/lib.macros.lisp @@ -77,3 +77,9 @@ arguments `LAMBDA-LIST' with body `BODY'." (declaim (ftype ,type ,name)) (defun ,name ,lambda-list ,@body))) + +(defmacro $ (&rest forms) + "Given a sequence of FORMS, return a unary function which applies each form +sequentially" + `(lambda (x) + (->> x ,@forms))) diff --git a/packages.lisp b/packages.lisp index aff5b68..d50945b 100644 --- a/packages.lisp +++ b/packages.lisp @@ -22,7 +22,8 @@ (:export :_ :--> :->> :while - :-> :fn)) + :-> :fn + :$)) (defpackage lib.functions (:use :cl :lib.macros) -- cgit v1.2.3-13-gbd6f