From e833e39e874d428f061d1882c2015f1adc8ac12e Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Sat, 15 Jul 2023 10:27:36 -0700 Subject: [PATCH] feat: calling and calling* --- lens.lisp | 5 +++++ package.lisp | 3 ++- t/lens.lisp | 12 ++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lens.lisp b/lens.lisp index 211cff3..066fd4f 100644 --- a/lens.lisp +++ b/lens.lisp @@ -344,6 +344,11 @@ `(lambda (,first-arg) (funcall (functionalize ,fun) ,first-arg ,@args)))) +(defmacro calling* (fun &rest args) + (alexandria:with-gensyms (last-arg) + `(lambda (,last-arg) + (funcall (functionalize ,fun) ,@args ,last-arg)))) + (defmacro applying (fun &rest args) (alexandria:with-gensyms (seq fsym) `(let ((,fsym (functionalize ,fun))) diff --git a/package.lisp b/package.lisp index 89df2c5..c639814 100644 --- a/package.lisp +++ b/package.lisp @@ -20,7 +20,8 @@ #:maximizing #:zipping #:applying #:splice-elt #:transform-elt #:denest #:op #:defalias #:<> #:<>1 #:== #:• #:∘ #:suffixp #:functionalize #:inc #:group-by #:keys - #:conj #:disj #:delay #:of-type #:transform)) + #:conj #:disj #:delay #:of-type #:transform #:calling* + #:calling)) (defpackage :data-lens.transducers.internals (:use :cl) diff --git a/t/lens.lisp b/t/lens.lisp index 73e30e1..a0815ef 100644 --- a/t/lens.lisp +++ b/t/lens.lisp @@ -284,3 +284,15 @@ (5am:is (equal (funcall (data-lens:transform 1) (data-lens:juxt '1- 'identity '1+)) '(0 1 2)))) + +(5am:def-test calling (:suite :data-lens.lens :depends-on (and functionalize)) + (5am:is (equal (funcall (data-lens:calling #'- 1) 3) + 2)) + (5am:is (equal (funcall (data-lens:calling #'- 2 1) 3) + 0))) + +(5am:def-test calling* (:suite :data-lens.lens :depends-on (and functionalize)) + (5am:is (equal (funcall (data-lens:calling* #'- 3) 1) + 2)) + (5am:is (equal (funcall (data-lens:calling* #'- 3 2) 1) + 0)))