(define-syntax let-optionals
  (syntax-rules ()
    ((let-optionals ("step") ls (vars ...) ((v d) . rest) . body)
     (let-optionals ("step") ls (vars ... (v tmp d)) rest . body))
    ((let-optionals ("step") ls ((var tmp default) ...) rest . body)
     (let-optionals* ls ((tmp default) ... . rest)
       (let ((var tmp) ...) . body)))
    ((let-optionals ls vars . body)
     (let-optionals ("step") ls () vars . body))))

(define-syntax opt-lambda
  (syntax-rules ()
    ((opt-lambda vars . body)
     (lambda args (let-optionals args vars . body)))))