add case-lambda
This commit is contained in:
		
							parent
							
								
									bb427cf275
								
							
						
					
					
						commit
						1d5fa803aa
					
				|  | @ -1397,3 +1397,48 @@ | |||
| 
 | ||||
| (import (picrin syntax-rules)) | ||||
| (export syntax-rules) | ||||
| 
 | ||||
| (define-library (scheme case-lambda) | ||||
|   (import (scheme base)) | ||||
| 
 | ||||
|   (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 ...))))) | ||||
| 
 | ||||
|   (export case-lambda)) | ||||
|  |  | |||
|  | @ -36,8 +36,7 @@ | |||
|         (scheme write) | ||||
| ;        (scheme eval) | ||||
|         (scheme process-context) | ||||
| ;        (scheme case-lambda) | ||||
|         ) | ||||
|         (scheme case-lambda)) | ||||
| 
 | ||||
| ;; R7RS test suite.  Covers all procedures and syntax in the small | ||||
| ;; language except `delete-file'.  Currently assumes full-unicode | ||||
|  | @ -409,32 +408,32 @@ | |||
| (test '(list 3 4) (quasiquote (list (unquote (+ 1 2)) 4)) ) | ||||
| (test `(list ,(+ 1 2) 4) (quasiquote (list (unquote (+ 1 2)) 4))) | ||||
| 
 | ||||
| ;; (define plus | ||||
| ;;   (case-lambda | ||||
| ;;    (() 0) | ||||
| ;;    ((x) x) | ||||
| ;;    ((x y) (+ x y)) | ||||
| ;;    ((x y z) (+ (+ x y) z)) | ||||
| ;;    (args (apply + args)))) | ||||
| (define plus | ||||
|   (case-lambda | ||||
|    (() 0) | ||||
|    ((x) x) | ||||
|    ((x y) (+ x y)) | ||||
|    ((x y z) (+ (+ x y) z)) | ||||
|    (args (apply + args)))) | ||||
| 
 | ||||
| ;; (test 0 (plus)) | ||||
| ;; (test 1 (plus 1)) | ||||
| ;; (test 3 (plus 1 2)) | ||||
| ;; (test 6 (plus 1 2 3)) | ||||
| ;; (test 10 (plus 1 2 3 4)) | ||||
| (test 0 (plus)) | ||||
| (test 1 (plus 1)) | ||||
| (test 3 (plus 1 2)) | ||||
| (test 6 (plus 1 2 3)) | ||||
| (test 10 (plus 1 2 3 4)) | ||||
| 
 | ||||
| ;; (define mult | ||||
| ;;   (case-lambda | ||||
| ;;    (() 1) | ||||
| ;;    ((x) x) | ||||
| ;;    ((x y) (* x y)) | ||||
| ;;    ((x y . z) (apply mult (* x y) z)))) | ||||
| (define mult | ||||
|   (case-lambda | ||||
|    (() 1) | ||||
|    ((x) x) | ||||
|    ((x y) (* x y)) | ||||
|    ((x y . z) (apply mult (* x y) z)))) | ||||
| 
 | ||||
| ;; (test 1 (mult)) | ||||
| ;; (test 1 (mult 1)) | ||||
| ;; (test 2 (mult 1 2)) | ||||
| ;; (test 6 (mult 1 2 3)) | ||||
| ;; (test 24 (mult 1 2 3 4)) | ||||
| (test 1 (mult)) | ||||
| (test 1 (mult 1)) | ||||
| (test 2 (mult 1 2)) | ||||
| (test 6 (mult 1 2 3)) | ||||
| (test 24 (mult 1 2 3 4)) | ||||
| 
 | ||||
| (test-end) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki