date.ss
(module date mzscheme
  
  (require
   (lib "etc.ss")
   (file "base.ss")
   )
  
  (provide 
   (all-defined)
   )
  
  (define (leap-year? year)
    (if (= (remainder year 4) 0)
        (if (= (remainder year 100) 0)
            (if (= (remainder year 400) 0)
                #t
                #f)
            #t)
        #f))
  
  (define days-in-month
    (opt-lambda (month [year 2001]) ; non-leap-year by default
      (case month
        [(9 4 6 11) 30]
        [(2) (if (leap-year? year) 29 28)]
        [(1 3 5 7 8 9 10 12) 31]
        [else (raise-exn 
               exn:fail:unlib
               (format "Month out of range: ~a" month))])))
  
  )