M guix/utils.scm => guix/utils.scm +16 -0
@@ 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."
M tests/utils.scm => tests/utils.scm +6 -0
@@ 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))