My version of 'let-optional' added by jrapdx 2 days ago
(define-library (let-kw) (export let-kw kw/dflt rm-symwd) (import scheme.base srfi-1) (begin (define (rm-symwd wd ls) (define w+ #f) (remove (lambda (el) (cond ((equal? wd el) (set! w+ #t) #t) (w+ (set! w+ #f) #t) (else #f))) ls)) (define-syntax kw/dflt (syntax-rules () ((_ dflt kw rest) (let ((mem (member kw rest))) (cond (mem (let ((res (cadr mem))) (set! rest (rm-symwd kw rest)) res)) (else dflt)))) ((_ dflt rest) (if (not (null? rest)) (let ((res (car rest))) (set! rest (cdr rest)) res) dflt)))) (define-syntax let-kw (syntax-rules () ((_ rest ((xkw xvar xval) ...) b0 ...) (let ((xvar (kw/dflt xval xkw rest)) ...) b0 ...)) ((_ rest ((xvar xval) ...) b0 ...) (let ((xvar (kw/dflt xval rest)) ...) b0 ...)))) )) ;;EXAMPLE let-kw offers optional (positional) + keyword/symbol params. Can do both as long as keyword clauses are first in cascade. Params not consumed by kw or optional inputs remain in the 'rest' param. Unlike DSSSL keywords are removed from the 'rest' variable--no ambiguity. (define (f x . rest) (let-kw rest ((y: y 17) (z: z 224)) (let-kw rest ((a 12)) (printnl x y z a rest)))) (f 'abc) -> abc 17 224 12 (f 'cde y: 77 88 'cat 'dog) -> cde 77 224 88 (cat dog)