~ruther/guix-local

ada3df03e33f686467ce4e887381e8753a3e603b — Ludovic Courtès 12 years ago 0c21d92
monads: Hide 'derivation-expression' and 'lower-inputs'.

* guix/monads.scm: Unexport 'lower-inputs' and 'derivation-expression'.
  (text-file*): Add comment about the switch to 'gexp->derivation'.
  (lower-inputs): Add comment about its doom.
  (derivation-expression): Likewise.
* guix/gexp.scm (lower-inputs*): Rename to...
  (lower-inputs): ... this.  Update callers.
* tests/monads.scm (derivation-expression): New procedure.
* doc/guix.texi (The Store Monad): Use 'gexp->derivation' instead of
  'derivation-expression'.  Remove documentation of
  'derivation-expression'.
* guix/ui.scm (read/eval): Use THE-ROOT-MODULE so that macros are
  properly expanded.
* tests/guix-build.sh: Use 'gexp->derivation' instead of
  'derivation-expression'.monads: Hide 'derivation-expression' and 'lower-inputs'.
6 files changed, 17 insertions(+), 22 deletions(-)

M doc/guix.texi
M guix/gexp.scm
M guix/monads.scm
M guix/ui.scm
M tests/guix-build.sh
M tests/monads.scm
M doc/guix.texi => doc/guix.texi +3 -11
@@ 1868,11 1868,12 @@ Consider this ``normal'' procedure:

Using @code{(guix monads)}, 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.
  (mlet %store-monad ((sh (package-file bash "bin")))
    (derivation-expression "sh" `(symlink ,sh %output))))
  (gexp->derivation "sh"
                    #~(symlink (string-append #$bash "/bin/bash") #$output)))
@end example

There are two things to note in the second version: the @code{store}


@@ 1973,15 1974,6 @@ directory of @var{package}.  When @var{file} is omitted, return the name
of the @var{output} directory of @var{package}.
@end deffn

@deffn {Monadic Procedure} derivation-expression @var{name} @var{exp} @
       [#:system (%current-system)] [#:inputs '()] @
       [#:outputs '("out")] [#:hash #f] @
       [#:hash-algo #f] [#:env-vars '()] [#:modules '()] @
       [#:references-graphs #f] [#:guile-for-build #f]
Monadic version of @code{build-expression->derivation}
(@pxref{Derivations}).
@end deffn

@deffn {Monadic Procedure} package->derivation @var{package} [@var{system}]
Monadic version of @code{package-derivation} (@pxref{Defining
Packages}).

M guix/gexp.scm => guix/gexp.scm +2 -3
@@ 66,10 66,9 @@
(define raw-derivation
  (store-lift derivation))

(define (lower-inputs* inputs)
(define (lower-inputs inputs)
  "Turn any package from INPUTS into a derivation; return the corresponding
input list as a monadic value."
  ;; XXX: This is like 'lower-inputs' but without the "name" part in tuples.
  (with-monad %store-monad
    (sequence %store-monad
              (map (match-lambda


@@ 101,7 100,7 @@ The other arguments are as for 'derivation'."
  (define %modules modules)
  (define outputs (gexp-outputs exp))

  (mlet* %store-monad ((inputs   (lower-inputs* (gexp-inputs exp)))
  (mlet* %store-monad ((inputs   (lower-inputs (gexp-inputs exp)))
                       (sexp     (gexp->sexp exp #:outputs outputs))
                       (builder  (text-file (string-append name "-builder")
                                            (object->string sexp)))

M guix/monads.scm => guix/monads.scm +4 -4
@@ 57,9 57,7 @@
            text-file*
            package-file
            package->derivation
            built-derivations
            derivation-expression
            lower-inputs)
            built-derivations)
  #:replace (imported-modules
             compiled-modules))



@@ 356,6 354,7 @@ and store file names; the resulting store file holds references to all these."
       (lambda (port)
         (display ,(computed-text text inputs) port))))

  ;; TODO: Rewrite using 'gexp->derivation'.
  (mlet %store-monad ((inputs (lower-inputs inputs)))
    (derivation-expression name (builder inputs)
                           #:inputs inputs)))


@@ 376,7 375,7 @@ OUTPUT directory of PACKAGE."
(define (lower-inputs inputs)
  "Turn any package from INPUTS into a derivation; return the corresponding
input list as a monadic value."
  ;; XXX: Should probably be in (guix packages).
  ;; XXX: This procedure is bound to disappear with 'derivation-expression'.
  (with-monad %store-monad
    (sequence %store-monad
              (map (match-lambda


@@ 390,6 389,7 @@ input list as a monadic value."
                   inputs))))

(define derivation-expression
  ;; XXX: This procedure is superseded by 'gexp->derivation'.
  (store-lift build-expression->derivation))

(define package->derivation

M guix/ui.scm => guix/ui.scm +1 -1
@@ 241,7 241,7 @@ interpreted."
                        str args)))))
    (catch #t
      (lambda ()
        (eval exp the-scm-module))
        (eval exp the-root-module))
      (lambda args
        (leave (_ "failed to evaluate expression `~a': ~s~%")
               exp args)))))

M tests/guix-build.sh => tests/guix-build.sh +4 -3
@@ 1,5 1,5 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
#
# This file is part of GNU Guix.
#


@@ 75,7 75,8 @@ then false; else true; fi

# Invoking a monadic procedure.
guix build -e "(begin
                 (use-modules (guix monads) (guix utils))
                 (use-modules (guix gexp))
                 (lambda ()
                   (derivation-expression \"test\" '(mkdir %output))))" \
                   (gexp->derivation \"test\"
                                     (gexp (mkdir (ungexp output))))))" \
   --dry-run

M tests/monads.scm => tests/monads.scm +3 -0
@@ 108,6 108,9 @@
                      guile)))
    #:guile-for-build (package-derivation %store %bootstrap-guile)))

(define derivation-expression
  (@@ (guix monads) derivation-expression))

(test-assert "mlet* + derivation-expression"
  (run-with-store %store
    (mlet* %store-monad ((guile  (package-file %bootstrap-guile "bin/guile"))