~ruther/guix-local

b6c6105cacf8093bafcdbb73fad591070cfaa8d7 — Ludovic Courtès 10 years ago ca2a55d
monads: Inline the procedure returned by liftN.

* guix/monads.scm (define-lift): Turn into a macro that open-codes the result
  of its lift.
1 files changed, 18 insertions(+), 5 deletions(-)

M guix/monads.scm
M guix/monads.scm => guix/monads.scm +18 -5
@@ 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))