diff options
author | Ludovic Courtès <ludo@gnu.org> | 2014-10-01 10:19:14 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2014-10-05 21:57:19 +0200 |
commit | 5e1103821a566e55c848c8fa323d07801cce6ab7 (patch) | |
tree | 866d0ce8fe5307eac5782f397067cfa3790eb0c1 | |
parent | b72a312c307131703bd65a9e2db04cd9b35d0fbe (diff) | |
download | guix-5e1103821a566e55c848c8fa323d07801cce6ab7.tar guix-5e1103821a566e55c848c8fa323d07801cce6ab7.tar.gz |
utils: Add 'strip-keyword-arguments'.
* guix/utils.scm (strip-keyword-arguments): New procedure.
* tests/utils.scm ("strip-keyword-arguments"): New test.
-rw-r--r-- | guix/utils.scm | 16 | ||||
-rw-r--r-- | tests/utils.scm | 6 |
2 files changed, 22 insertions, 0 deletions
diff --git a/guix/utils.scm b/guix/utils.scm index 34a5e6c971..2814247a68 100644 --- a/guix/utils.scm +++ b/guix/utils.scm @@ -48,6 +48,7 @@ compile-time-value fcntl-flock memoize + strip-keyword-arguments default-keyword-arguments substitute-keyword-arguments @@ -424,6 +425,21 @@ exception if it's already taken." (hash-set! cache args results) (apply values results))))))) +(define (strip-keyword-arguments keywords args) + "Remove all of the keyword arguments listed in KEYWORDS from ARGS." + (let loop ((args args) + (result '())) + (match args + (() + (reverse result)) + (((? keyword? kw) arg . rest) + (loop rest + (if (memq kw keywords) + result + (cons* arg kw result)))) + ((head . tail) + (loop tail (cons head result)))))) + (define (default-keyword-arguments args defaults) "Return ARGS augmented with any keyword/value from DEFAULTS for keywords not already present in ARGS." diff --git a/tests/utils.scm b/tests/utils.scm index 611867ca09..a662c9a8d3 100644 --- a/tests/utils.scm +++ b/tests/utils.scm @@ -120,6 +120,12 @@ '(0 1 2 3))) list)) +(test-equal "strip-keyword-arguments" + '(a #:b b #:c c) + (strip-keyword-arguments '(#:foo #:bar #:baz) + '(a #:foo 42 #:b b #:baz 3 + #:c c #:bar 4))) + (let* ((tree (alist->vhash '((0 2 3) (1 3 4) (2) (3 5 6) (4 6) (5) (6)) hashq)) |