diff options
author | Ludovic Courtès <ludo@gnu.org> | 2014-10-08 23:35:08 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2014-10-08 23:35:20 +0200 |
commit | 405a9d4ec9806993a6453f0dfba78fc65d5e7993 (patch) | |
tree | 83096b186be61f0a0daca3b808ab2aeb58bfb352 /guix | |
parent | 2e1bafb03438757c7cc34c16230b00623507ff84 (diff) |
monads: Add 'mbegin'.
* guix/monads.scm (mbegin): New macro.
* tests/monads.scm ("mbegin"): New test.
* doc/guix.texi (The Store Monad): Document it.
Diffstat (limited to 'guix')
-rw-r--r-- | guix/monads.scm | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/guix/monads.scm b/guix/monads.scm index 2ab3fb94f0..d9580a7f8e 100644 --- a/guix/monads.scm +++ b/guix/monads.scm @@ -38,6 +38,7 @@ with-monad mlet mlet* + mbegin lift1 lift2 lift3 lift4 lift5 lift6 lift7 lift listm foldm @@ -171,6 +172,19 @@ form is (VAR -> VAL), bind VAR to the non-monadic value VAL in the same way as (let ((var temp) ...) body ...))))))) +(define-syntax mbegin + (syntax-rules () + "Bind the given monadic expressions in sequence, returning the result of +the last one." + ((_ monad mexp) + (with-monad monad + mexp)) + ((_ monad mexp rest ...) + (with-monad monad + (>>= mexp + (lambda (unused-value) + (mbegin monad rest ...))))))) + (define-syntax define-lift (syntax-rules () ((_ liftn (args ...)) |