27 lines
		
	
	
		
			843 B
		
	
	
	
		
			Scheme
		
	
	
	
			
		
		
	
	
			27 lines
		
	
	
		
			843 B
		
	
	
	
		
			Scheme
		
	
	
	
| (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))
 |