27 lines
880 B
Scheme
27 lines
880 B
Scheme
(define-module (ordo util keyword-args)
|
|
#:use-module (ice-9 exceptions)
|
|
#:export (keyword-arg
|
|
select-keyword-args
|
|
validate-keyword-args))
|
|
|
|
(define* (keyword-arg args kw #:optional (default #f))
|
|
(cond
|
|
((< (length args) 2) default)
|
|
((equal? (car args) kw) (cadr args))
|
|
(else (keyword-arg (cddr args) kw default))))
|
|
|
|
(define (select-keyword-args kwargs wanted)
|
|
(let loop ((kwargs kwargs) (accum '()))
|
|
(cond
|
|
((null? kwargs)
|
|
(reverse accum))
|
|
((member (car kwargs) wanted)
|
|
(loop (cddr kwargs) (cons* (car kwargs) (cadr kwargs) accum)))
|
|
(else (loop (cddr kwargs) accum)))))
|
|
|
|
(define (validate-keyword-args kwargs)
|
|
(unless (even? (length kwargs))
|
|
(raise-exception
|
|
(make-exception
|
|
(make-programming-error)
|
|
(make-exception-with-message "keyword args should have an even number of elements")))))
|