The case-lambda keyword (see section 13.2)
could be defined in terms of base library by the following macros:
(define-syntax case-lambda
(syntax-rules ()
((case-lambda
(formals-0 body0-0 body1-0 ...)
(formals-1 body0-1 body1-1 ...)
...)
(lambda args
(let ((l (length args)))
(case-lambda-helper
l args
(formals-0 body0-0 body1-0 ...)
(formals-1 body0-1 body1-1 ...) ...))))))
(define-syntax case-lambda-helper
(syntax-rules ()
((case-lambda-helper
l args
((formal ...) body ...)
clause ...)
(if (= l (length ’(formal ...)))
(apply (lambda (formal ...) body ...)
args)
(case-lambda-helper l args clause ...)))
((case-lambda-helper
l args
((formal . formals-rest) body ...)
clause ...)
(case-lambda-helper-dotted
l args
(body ...)
(formal . formals-rest)
formals-rest 1
clause ...))
((case-lambda-helper
l args
(formal body ...))
(let ((formal args))
body ...))))
(define-syntax case-lambda-helper-dotted
(syntax-rules ()
((case-lambda-helper-dotted
l args
(body ...)
formals
(formal . formals-rest) k
clause ...)
(case-lambda-helper-dotted
l args
(body ...)
formals
formals-rest (+ 1 k)
clause ...))
((case-lambda-helper-dotted
l args
(body ...)
formals
rest-formal k
clause ...)
(if (>= l k)
(apply (lambda formals body ...) args)
(case-lambda-helper
l args clause ...)))))