(define-library (picrin optional)
  (import (scheme base))

  (define-syntax optional
    (syntax-rules ()
      ((_ args default)
       (let ((t args))
         (if (null? t) default (car t))))))

  (define-syntax let-optionals*
    (syntax-rules ()
      ((_ args () body ...)
       (begin body ...))
      ((_ args ((var default) . tail) body ...)
       (let* ((t args)
              (var (if (null? t) default (car t)))
              (remain (if (null? t) '() (cdr t))))
         (let-optionals* remain tail body ...)))
      ((_ args rest body ...)
       (let ((rest args))
         body ...))))

  (export optional
          let-optionals*))