From b6c6105cacf8093bafcdbb73fad591070cfaa8d7 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Fri, 28 Aug 2015 15:17:20 +0200 Subject: monads: Inline the procedure returned by liftN. * guix/monads.scm (define-lift): Turn into a macro that open-codes the result of its lift. --- guix/monads.scm | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/guix/monads.scm b/guix/monads.scm index 2196a9c991..61cd533bf4 100644 --- a/guix/monads.scm +++ b/guix/monads.scm @@ -225,11 +225,24 @@ CONDITION is true, return *unspecified* in the current monad." (define-syntax define-lift (syntax-rules () ((_ liftn (args ...)) - (define (liftn proc monad) - "Lift PROC to MONAD---i.e., return a monadic function in MONAD." - (lambda (args ...) - (with-monad monad - (return (proc args ...)))))))) + (define-syntax liftn + (lambda (s) + "Lift PROC to MONAD---i.e., return a monadic function in MONAD." + (syntax-case s () + ((liftn proc monad) + ;; Inline the result of lifting PROC, such that 'return' can in + ;; turn be open-coded. + #'(lambda (args ...) + (with-monad monad + (return (proc args ...))))) + (id + (identifier? #'id) + ;; Slow path: Return a closure-returning procedure (we don't + ;; guarantee (eq? LIFTN LIFTN), but that's fine.) + (lambda (liftn proc monad) + (lambda (args ...) + (with-monad monad + (return (proc args ...)))))))))))) (define-lift lift0 ()) (define-lift lift1 (a)) -- cgit 1.4.1