This is so jank but I was frustrated with how the rest parameter redundantly has all the keywords left in (unlike stragglers in define-options) so I did a grobian solution at least for now:
(define (strip-keys keys) (fn (strip-keys x keys)))
(define (strip-keys lis keys) (cons (car lis) (strip-keys (cdr lis) keys)))
(define (strip-keys (kw val . lis) keys)
(strip-keys (require (member kw keys) lis) keys))
(define (strip-keys () keys) '())
And then here’s an example of it in use:
(define (lsrss #!rest files #!key (append #f))
(set! files (strip-keys files '(#:append)))
(...))