aboutsummaryrefslogtreecommitdiff
path: root/guix/utils.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2012-11-05 23:46:55 +0100
committerLudovic Courtès <ludo@gnu.org>2012-11-05 23:50:57 +0100
commit0af2c24ef788bffbdb30b4662d15fcd194a51e48 (patch)
tree7f76abb82fe1a2662cf922d1843bbac945ddecb7 /guix/utils.scm
parenta48dddfe9cf19b9c301ca170eacc05604b5cefac (diff)
downloadgnu-guix-0af2c24ef788bffbdb30b4662d15fcd194a51e48.tar
gnu-guix-0af2c24ef788bffbdb30b4662d15fcd194a51e48.tar.gz
utils: Add `default-keyword-arguments' and `substitute-keyword-arguments'.
* distro/packages/base.scm (default-keyword-arguments, substitute-keyword-arguments): Move to... * guix/utils.scm: ... here.
Diffstat (limited to 'guix/utils.scm')
-rw-r--r--guix/utils.scm33
1 files changed, 33 insertions, 0 deletions
diff --git a/guix/utils.scm b/guix/utils.scm
index 7ebc026702..fa5abadc7a 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -49,6 +49,8 @@
define-record-type*
compile-time-value
memoize
+ default-keyword-arguments
+ substitute-keyword-arguments
location
location?
@@ -546,6 +548,37 @@ FIELD/DEFAULT-VALUE tuples."
(hash-set! cache args results)
(apply values results)))))))
+(define (default-keyword-arguments args defaults)
+ "Return ARGS augmented with any keyword/value from DEFAULTS for
+keywords not already present in ARGS."
+ (let loop ((defaults defaults)
+ (args args))
+ (match defaults
+ ((kw value rest ...)
+ (loop rest
+ (if (assoc-ref kw args)
+ args
+ (cons* kw value args))))
+ (()
+ args))))
+
+(define-syntax substitute-keyword-arguments
+ (syntax-rules ()
+ "Return a new list of arguments where the value for keyword arg KW is
+replaced by EXP. EXP is evaluated in a context where VAR is boud to the
+previous value of the keyword argument."
+ ((_ original-args ((kw var) exp) ...)
+ (let loop ((args original-args)
+ (before '()))
+ (match args
+ ((kw var rest (... ...))
+ (loop rest (cons* exp kw before)))
+ ...
+ ((x rest (... ...))
+ (loop rest (cons x before)))
+ (()
+ (reverse before)))))))
+
(define (gnu-triplet->nix-system triplet)
"Return the Nix system type corresponding to TRIPLET, a GNU triplet as
returned by `config.guess'."