diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-08-28 15:17:20 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-08-29 01:22:54 +0200 |
commit | b6c6105cacf8093bafcdbb73fad591070cfaa8d7 (patch) | |
tree | e6b706f77d2955bd014dca94112cec6d481ee708 /guix | |
parent | ca2a55d46b7b13faf424cb8721f2d6fe662119d7 (diff) |
monads: Inline the procedure returned by liftN.
* guix/monads.scm (define-lift): Turn into a macro that open-codes the result
of its lift.
Diffstat (limited to 'guix')
-rw-r--r-- | guix/monads.scm | 23 |
1 files 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)) |