;;;; Cyclone Scheme
;;;; https://github.com/justinethier/cyclone
;;;;
;;;; A case-lambda implementation, based off the one from chibi scheme.
;;;;
(define-library (scheme case-lambda)
  (import (scheme base))
  (export 
    case-lambda
;    %case
  )
  (begin

   (define-syntax %case
     (syntax-rules ()
       ((%case args len n p ((params ...) . body) . rest)
        (if (= len (length '(params ...)))
            (apply (lambda (params ...) . body) args)
            (%case args len 0 () . rest)))
       ((%case args len n (p ...) ((x . y) . body) . rest)
        (%case args len (+ n 1) (p ... x) (y . body) . rest))
       ((%case args len n (p ...) (y . body) . rest)
        (if (>= len n)
            (apply (lambda (p ... . y) . body) args)
            (%case args len 0 () . rest)))
       ((%case args len n p)
        (error "case-lambda: no cases matched"))))
   (define-syntax case-lambda
     (syntax-rules ()
       ((case-lambda . clauses)
        (lambda args (let ((len (length args))) (%case args len 0 () . clauses))))))
        ;(lambda args (let ((len (length* args))) (%case args len 0 () . clauses))))))
))