(define ((make-constructor-procedure proc #!key [apply-args values]) . args) (let more ([keys '()] [key-args '()] [pos-args '()] [rest args]) (cond [(null? rest) (let ([handle (apply proc (apply-args (reverse! pos-args)))]) (do-ec (:parallel (:list key keys) (:list arg key-args)) ((if (procedure? arg) callback-set! attribute-set!) handle key arg)) handle)] [(keyword? (car rest)) (more (cons (car rest) keys) (cons (cadr rest) key-args) pos-args (cddr rest))] [else (more keys key-args (cons (car rest) pos-args) (cdr rest))])))