~ruther/guix-local

5e1103821a566e55c848c8fa323d07801cce6ab7 — Ludovic Courtès 11 years ago b72a312
utils: Add 'strip-keyword-arguments'.

* guix/utils.scm (strip-keyword-arguments): New procedure.
* tests/utils.scm ("strip-keyword-arguments"): New test.
2 files changed, 22 insertions(+), 0 deletions(-)

M guix/utils.scm
M tests/utils.scm
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))