Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 335570c

Browse files
committed
arity+keywords-combine/and
1 parent 9ff05e9 commit 335570c

File tree

3 files changed

+98
-13
lines changed

3 files changed

+98
-13
lines changed

keyword-lambda/arity+keywords.rkt

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
arity+keywords-matches?
88
procedure-arity+keywords-matches?
99
procedure-arity+keywords-matches?/c
10+
arity+keywords-combine/or
11+
arity+keywords-combine/and
1012
arity+keywords-combine
1113
)
1214

@@ -69,7 +71,7 @@
6971
(lambda (proc)
7072
(procedure-arity+keywords-matches? proc n kws))))
7173

72-
(define arity+keywords-combine
74+
(define arity+keywords-combine/or
7375
(case-lambda
7476
[() (arity+keywords '() '() '())]
7577
[(a) a]
@@ -97,5 +99,83 @@
9799
(append a1.allowed-kws
98100
a2.allowed-kws))))
99101
(arity+keywords arity required-kws allowed-kws)]))]
100-
[(a1 . rest-args) (arity+keywords-combine a1 (apply arity+keywords-combine rest-args))]
102+
[(a1 . rest-args) (arity+keywords-combine/or a1 (apply arity+keywords-combine/or rest-args))]
101103
))
104+
105+
(define arity+keywords-combine arity+keywords-combine/or)
106+
107+
(define arity+keywords-combine/and
108+
(case-lambda
109+
[() (arity+keywords (arity-at-least 0) '() #f)]
110+
[(a) a]
111+
[(a1 a2) (let ([a1.arity (arity+keywords-arity a1)]
112+
[a1.required-kws (arity+keywords-required-kws a1)]
113+
[a1.allowed-kws (arity+keywords-allowed-kws a1)]
114+
[a2.arity (arity+keywords-arity a2)]
115+
[a2.required-kws (arity+keywords-required-kws a2)]
116+
[a2.allowed-kws (arity+keywords-allowed-kws a2)])
117+
(define arity
118+
(arity-combine/and a1.arity a2.arity))
119+
(define required-kws
120+
(remove-duplicates
121+
(append a1.required-kws
122+
a2.required-kws)))
123+
(define allowed-kws
124+
(cond [(not (list? a1.allowed-kws)) a2.allowed-kws]
125+
[(not (list? a2.allowed-kws)) a1.allowed-kws]
126+
[else
127+
(for*/list ([a1-kw (in-list a1.required-kws)]
128+
[a2-kw (in-list a2.required-kws)]
129+
#:when (equal? a1-kw a2-kw))
130+
a1-kw)]))
131+
(arity+keywords arity required-kws allowed-kws))
132+
]
133+
[(a1 . rest-args) (arity+keywords-combine/and a1 (apply arity+keywords-combine/and rest-args))]
134+
))
135+
136+
(define (arity-combine/and a1 a2)
137+
(let ([a1 (normalize-arity a1)]
138+
[a2 (normalize-arity a2)])
139+
(cond [(arity-includes? a1 a2) a2]
140+
[(arity-includes? a2 a1) a1]
141+
[(number? a1)
142+
(cond [(arity-includes? a2 a1) a1]
143+
[else '()])]
144+
[(number? a2)
145+
(cond [(arity-includes? a1 a2) a2]
146+
[else '()])]
147+
[(arity-at-least? a1)
148+
(cond [(arity-includes? a2 a1) a1]
149+
[(number? a2) '()]
150+
[(arity-at-least? a2)
151+
(arity-at-least (max (arity-at-least-value a1)
152+
(arity-at-least-value a2)))]
153+
[(list? a2)
154+
(normalize-arity
155+
(flatten
156+
(for/list ([n (in-list a2)])
157+
(arity-combine/and a1 n))))]
158+
[else (error 'arity-combine/and "this should never happen")])]
159+
[(arity-at-least? a2)
160+
(cond [(arity-includes? a1 a2) a2]
161+
[(number? a1) '()]
162+
[(arity-at-least? a1)
163+
(arity-at-least (max (arity-at-least-value a1)
164+
(arity-at-least-value a2)))]
165+
[(list? a1)
166+
(normalize-arity
167+
(flatten
168+
(for/list ([n (in-list a1)])
169+
(arity-combine/and a2 n))))]
170+
[else (error 'arity-combine/and "this should never happen")])]
171+
[(list? a1)
172+
(normalize-arity
173+
(flatten
174+
(for/list ([n (in-list a1)])
175+
(arity-combine/and a2 n))))]
176+
[(list? a2)
177+
(normalize-arity
178+
(flatten
179+
(for/list ([n (in-list a2)])
180+
(arity-combine/and a1 n))))]
181+
[else (error 'arity-combine/and "this should never happen")])))

keyword-lambda/docs/keyword-lambda.scrbl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,12 @@ produces a flat contract (also a predicate) that accepts procedures that accept
170170
arguments and accepts the keywords in @racket[kws].
171171
}
172172

173-
@defproc[(arity+keywords-combine [arity+kws arity+keywords?] ...) arity+keywords?]{
173+
@defproc[(arity+keywords-combine/or [arity+kws arity+keywords?] ...) arity+keywords?]{
174174
combines the @racket[arity+kws]es into one @racket[arity+keywords] instance in an or-like way.
175175

176176
@examples[
177177
#:eval
178178
(make-hash-lambda-evaluator)
179-
(arity+keywords-combine (arity+keywords 1 '(#:kw-1) '(#:kw-1 #:kw-2 #:kw-3))
180-
(arity+keywords 2 '(#:kw-1 #:kw-2) '(#:kw-1 #:kw-2 #:kw-4)))
179+
(arity+keywords-combine/or (arity+keywords 1 '(#:kw-1) '(#:kw-1 #:kw-2 #:kw-3))
180+
(arity+keywords 2 '(#:kw-1 #:kw-2) '(#:kw-1 #:kw-2 #:kw-4)))
181181
]}

mutable-match-lambda/make-clause-proc.rkt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,19 @@
2020
))
2121

2222
(define (make-clause-proc test proc)
23-
(procedure-rename
24-
(keyword-lambda (kws kw-args . rest-args)
25-
(cond [(and (arity+keywords-matches? (procedure-arity+keywords test) (length rest-args) kws)
26-
(keyword-apply test kws kw-args rest-args))
27-
(keyword-apply proc kws kw-args rest-args)]
28-
[else
29-
(mutable-match-lambda-next)]))
30-
(string->symbol (format "(make-clause-proc ~v ~v)" test proc))))
23+
(define test.arity+kws (procedure-arity+keywords test))
24+
(define proc.arity+kws (procedure-arity+keywords proc))
25+
(procedure-reduce-arity+keywords
26+
(procedure-rename
27+
(keyword-lambda (kws kw-args . rest-args)
28+
(cond [(and (arity+keywords-matches? test.arity+kws (length rest-args) kws)
29+
(arity+keywords-matches? proc.arity+kws (length rest-args) kws)
30+
(keyword-apply test kws kw-args rest-args))
31+
(keyword-apply proc kws kw-args rest-args)]
32+
[else
33+
(mutable-match-lambda-next)]))
34+
(string->symbol (format "(make-clause-proc ~v ~v)" test proc)))
35+
(arity+keywords-combine/and test.arity+kws proc.arity+kws)))
3136

3237
(define-syntax clause->proc
3338
(lambda (stx)

0 commit comments

Comments
 (0)