monads: Inline the procedure returned by liftN.
* guix/monads.scm (define-lift): Turn into a macro that open-codes the result of its lift.
This commit is contained in:
parent
ca2a55d46b
commit
b6c6105cac
|
@ -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)
|
||||
(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 ...))))))))
|
||||
(return (proc args ...))))))))))))
|
||||
|
||||
(define-lift lift0 ())
|
||||
(define-lift lift1 (a))
|
||||
|
|
Loading…
Reference in New Issue