summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-05-04 15:05:13 +0200
committerLudovic Courtès <ludo@gnu.org>2015-05-04 15:08:20 +0200
commitc6f30b81851fde4be31aae7b9d36356c8f72963a (patch)
tree53b2af72b5ad8648d5cf83f22c6e551e667a95b7 /doc
parenteabebb8143193fadf5338aaebeafde33266b30af (diff)
downloadpatches-c6f30b81851fde4be31aae7b9d36356c8f72963a.tar
patches-c6f30b81851fde4be31aae7b9d36356c8f72963a.tar.gz
doc: Fix dangling references in the 'sh-symlink' monad example.
Reported by Christopher A. Webber <cwebber@dustycloud.org>. * doc/guix.texi (The Store Monad): Reintroduce 'mlet' in 'sh-symlink' example. Move the simplified version below. Explain that the 'store' parameter is threaded.
Diffstat (limited to 'doc')
-rw-r--r--doc/guix.texi31
1 files changed, 22 insertions, 9 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index dea1415616..d9db408e57 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -2346,21 +2346,34 @@ Consider this ``normal'' procedure:
`(symlink ,sh %output))))
@end example
-Using @code{(guix monads)}, it may be rewritten as a monadic function:
+Using @code{(guix monads)} and @code{(guix gexp)}, it may be rewritten
+as a monadic function:
-@c FIXME: Find a better example, one that uses 'mlet'.
@example
(define (sh-symlink)
;; Same, but return a monadic value.
- (gexp->derivation "sh"
- #~(symlink (string-append #$bash "/bin/bash") #$output)))
+ (mlet %store-monad ((drv (package->derivation bash)))
+ (gexp->derivation "sh"
+ #~(symlink (string-append #$drv "/bin/bash")
+ #$output))))
@end example
-There are two things to note in the second version: the @code{store}
-parameter is now implicit, and the monadic value returned by
-@code{package-file}---a wrapper around @code{package-derivation} and
-@code{derivation->output-path}---is @dfn{bound} using @code{mlet}
-instead of plain @code{let}.
+There several things to note in the second version: the @code{store}
+parameter is now implicit and is ``threaded'' in the calls to the
+@code{package->derivation} and @code{gexp->derivation} monadic
+procedures, and the monadic value returned by @code{package->derivation}
+is @dfn{bound} using @code{mlet} instead of plain @code{let}.
+
+As it turns out, the call to @code{package->derivation} can even be
+omitted since it will take place implicitly, as we will see later
+(@pxref{G-Expressions}):
+
+@example
+(define (sh-symlink)
+ (gexp->derivation "sh"
+ #~(symlink (string-append #$bash "/bin/bash")
+ #$output)))
+@end example
Calling the monadic @code{sh-symlink} has no effect. To get the desired
effect, one must use @code{run-with-store}: