(define-library (scheme case-lambda)
  (import (scheme base))

  (define (length+ list)
    (if (pair? list)
        (+ 1 (length+ (cdr list)))
        0))

  (define-syntax case-lambda
    (syntax-rules ()
      ((case-lambda (params body0 ...) ...)
       (lambda args
         (let ((len (length args)))
           (letrec-syntax
               ((cl (syntax-rules ()
                      ((cl)
                       (error "no matching clause"))
                      ((cl (formal . body) . rest)
                       (if (if (list? 'formal)
                               (= len (length 'formal))
                               (>= len (length+ 'formal)))
                           (apply (lambda formal . body) args)
                           (cl . rest))))))
             (cl (params body0 ...) ...)))))))

  (export case-lambda))