123456789101112131415161718192021222324252627282930313233343536373839404142 |
- ; Copied from Lars T Hansen's SRFI document.
- (define-syntax case-lambda
- (syntax-rules ()
- ((case-lambda
- (?a1 ?e1 ...)
- ?clause1 ...)
- (lambda args
- (let ((l (length args)))
- (case-lambda "CLAUSE" args l
- (?a1 ?e1 ...)
- ?clause1 ...))))
- ((case-lambda "CLAUSE" ?args ?l
- ((?a1 ...) ?e1 ...)
- ?clause1 ...)
- (if (= ?l (length '(?a1 ...)))
- (apply (lambda (?a1 ...) ?e1 ...) ?args)
- (case-lambda "CLAUSE" ?args ?l
- ?clause1 ...)))
- ((case-lambda "CLAUSE" ?args ?l
- ((?a1 . ?ar) ?e1 ...)
- ?clause1 ...)
- (case-lambda "IMPROPER" ?args ?l 1 (?a1 . ?ar) (?ar ?e1 ...)
- ?clause1 ...))
- ((case-lambda "CLAUSE" ?args ?l
- (?a1 ?e1 ...)
- ?clause1 ...)
- (let ((?a1 ?args))
- ?e1 ...))
- ((case-lambda "CLAUSE" ?args ?l)
- (error "Wrong number of arguments to CASE-LAMBDA."))
- ((case-lambda "IMPROPER" ?args ?l ?k ?al ((?a1 . ?ar) ?e1 ...)
- ?clause1 ...)
- (case-lambda "IMPROPER" ?args ?l (+ ?k 1) ?al (?ar ?e1 ...)
- ?clause1 ...))
- ((case-lambda "IMPROPER" ?args ?l ?k ?al (?ar ?e1 ...)
- ?clause1 ...)
- (if (>= ?l ?k)
- (apply (lambda ?al ?e1 ...) ?args)
- (case-lambda "CLAUSE" ?args ?l
- ?clause1 ...)))))
|