let-optionals.ss
(module let-optionals mzscheme (provide let-optionals*)

;; (define-syntax let-optionals*
;;   (syntax-rules ()
;;     ((_ opt-ls () body ...)
;;      (let () body ...))
;;     ((_ (expr ...) vars body ...)
;;      (let ((tmp (expr ...)))
;;        (let-optionals* tmp vars body ...)))
;;     ((_ tmp ((var default) . rest) body ...)
;;      (let ((var (if (pair? tmp) (car tmp) default))
;;            (tmp2 (if (pair? tmp) (cdr tmp) '())))
;;        (let-optionals* tmp2 rest body ...)))
;;     ((_ tmp tail body ...)
;;      (let ((tail tmp))
;;        body ...))
;;     ))

(define-syntax let-optionals*
  (syntax-rules ()
    ((_ opt-ls () . body)
     (let () . body))
    ((_ (op . args) vars . body)
     (let ((tmp (op . args)))
       (let-optionals* tmp vars . body)))
    ((_ tmp ((var default) . rest) . body)
     (let ((var (if (pair? tmp) (car tmp) default))
           (tmp2 (if (pair? tmp) (cdr tmp) '())))
       (let-optionals* tmp2 rest . body)))
    ((_ tmp tail . body)
     (let ((tail tmp))
       . body))
    ))

)