|
3 | 3 | (library (rnrs control (6)) |
4 | 4 | (export when unless do case-lambda) |
5 | 5 | (import (core) |
6 | | - (core base) |
7 | | - (only (sagittarius) reverse!) |
8 | | - (core syntax)) |
9 | | - |
10 | | - (define-syntax case-lambda-aux |
11 | | - (lambda (x) |
12 | | - (define (construct args formals clause*) |
13 | | - (define _car #'car) |
14 | | - (define _cdr #'cdr) |
15 | | - (define (parse-formals formal args inits) |
16 | | - (syntax-case formal () |
17 | | - (() (reverse! inits)) |
18 | | - ((a . d) |
19 | | - (with-syntax ((arg `(,_car ,args)) |
20 | | - (args `(,_cdr ,args))) |
21 | | - (parse-formals #'d #'args |
22 | | - (cons (list #'a #'arg) inits)))) |
23 | | - (v |
24 | | - (reverse! (cons (list #'v args) inits))))) |
25 | | - (with-syntax ((((var init) ...) (parse-formals formals args '())) |
26 | | - ((clause ...) clause*)) |
27 | | - ;; Using `lambda` enables type check, immediate apply |
28 | | - ;; will be converted to let by the compiler. |
29 | | - #'((lambda (var ...) clause ...) init ...))) |
30 | | - (syntax-case x () |
31 | | - ((_ args n) |
32 | | - #'(assertion-violation #f "unexpected number of arguments" args)) |
33 | | - ((_ args n ((x ...) b ...) more ...) |
34 | | - (with-syntax ((let-clause (construct #'args #'(x ...) #'(b ...))) |
35 | | - (expect-length (length #'(x ...)))) |
36 | | - #'(if (= n expect-length) |
37 | | - let-clause |
38 | | - (case-lambda-aux args n more ...)))) |
39 | | - ((_ args n ((x1 x2 ... . r) b ...) more ...) |
40 | | - (with-syntax ((let-clause (construct #'args #'(x1 x2 ... . r) |
41 | | - #'(b ...))) |
42 | | - (expect-length (length #'(x1 x2 ...)))) |
43 | | - #'(if (>= n expect-length) |
44 | | - let-clause |
45 | | - (case-lambda-aux args n more ...)))) |
46 | | - ((_ args n (r b ...) more ...) |
47 | | - #'(let ((r args)) b ...))))) |
48 | | - |
49 | | - (define-syntax case-lambda |
50 | | - (syntax-rules () |
51 | | - ((_ (fmls b1 b2 ...)) |
52 | | - (lambda fmls b1 b2 ...)) |
53 | | - ((_ (fmls b1 b2 ...) ...) |
54 | | - (lambda args |
55 | | - (let ((n (length args))) |
56 | | - (case-lambda-aux args n (fmls b1 b2 ...) ...)))))) |
57 | | - |
58 | | - |
59 | | - ;; implementation from srfi-16 |
60 | | -;; (define-syntax case-lambda |
61 | | -;; (syntax-rules () |
62 | | -;; ((case-lambda (?a1 ?e1 ...) ?clause1 ...) |
63 | | -;; (lambda args |
64 | | -;; (let ((l (length args))) |
65 | | -;; (case-lambda "CLAUSE" args l |
66 | | -;; (?a1 ?e1 ...) |
67 | | -;; ?clause1 ...)))) |
68 | | -;; ((case-lambda "CLAUSE" ?args ?l |
69 | | -;; ((?a1 ...) ?e1 ...) |
70 | | -;; ?clause1 ...) |
71 | | -;; (if (= ?l (length '(?a1 ...))) |
72 | | -;; (apply (lambda (?a1 ...) ?e1 ...) ?args) |
73 | | -;; (case-lambda "CLAUSE" ?args ?l |
74 | | -;; ?clause1 ...))) |
75 | | -;; ((case-lambda "CLAUSE" ?args ?l |
76 | | -;; ((?a1 . ?ar) ?e1 ...) |
77 | | -;; ?clause1 ...) |
78 | | -;; (case-lambda "IMPROPER" ?args ?l 1 (?a1 . ?ar) (?ar ?e1 ...) |
79 | | -;; ?clause1 ...)) |
80 | | -;; ((case-lambda "CLAUSE" ?args ?l |
81 | | -;; (?a1 ?e1 ...) |
82 | | -;; ?clause1 ...) |
83 | | -;; (let ((?a1 ?args)) |
84 | | -;; ?e1 ...)) |
85 | | -;; ((case-lambda "CLAUSE" ?args ?l) |
86 | | -;; (syntax-violation 'case-lambda |
87 | | -;; "wrong number of arguments to case-lambda.")) |
88 | | -;; ((case-lambda "IMPROPER" ?args ?l ?k ?al ((?a1 . ?ar) ?e1 ...) |
89 | | -;; ?clause1 ...) |
90 | | -;; (case-lambda "IMPROPER" ?args ?l (+ ?k 1) ?al (?ar ?e1 ...) |
91 | | -;; ?clause1 ...)) |
92 | | -;; ((case-lambda "IMPROPER" ?args ?l ?k ?al (?ar ?e1 ...) |
93 | | -;; ?clause1 ...) |
94 | | -;; (if (>= ?l ?k) |
95 | | -;; (apply (lambda ?al ?e1 ...) ?args) |
96 | | -;; (case-lambda "CLAUSE" ?args ?l |
97 | | -;; ?clause1 ...))))) |
98 | | - ;; implementation from R6RS |
99 | | -;; (define-syntax case-lambda-help |
100 | | -;; (syntax-rules () |
101 | | -;; ((_ args n) |
102 | | -;; (assertion-violation #f "unexpected number of arguments")) |
103 | | -;; ((_ args n ((x ...) b1 b2 ...) more ...) |
104 | | -;; (if (= n (length '(x ...))) |
105 | | -;; (apply (lambda (x ...) b1 b2 ...) args) |
106 | | -;; (case-lambda-help args n more ...))) |
107 | | -;; ((_ args n ((x1 x2 ... . r) b1 b2 ...) more ...) |
108 | | -;; (if (>= n (length '(x1 x2 ...))) |
109 | | -;; (apply (lambda (x1 x2 ... . r) b1 b2 ...) |
110 | | -;; args) |
111 | | -;; (case-lambda-help args n more ...))) |
112 | | -;; ((_ args n (r b1 b2 ...) more ...) |
113 | | -;; (apply (lambda r b1 b2 ...) args)))) |
114 | | -;; |
115 | | -;; (define-syntax case-lambda |
116 | | -;; (syntax-rules () |
117 | | -;; ((_ (fmls b1 b2 ...)) |
118 | | -;; (lambda fmls b1 b2 ...)) |
119 | | -;; ((_ (fmls b1 b2 ...) ...) |
120 | | -;; (lambda args |
121 | | -;; (let ((n (length args))) |
122 | | -;; (case-lambda-help args n |
123 | | -;; (fmls b1 b2 ...) ...)))))) |
124 | | - |
125 | | -) ; [end] |
126 | | -;; end of file |
127 | | -;; Local Variables: |
128 | | -;; coding: utf-8-unix |
129 | | -;; End: |
| 6 | + (core control))) |
0 commit comments