Fix build. Forgot to add this file in c305dba
.
Apologies to any future git bisect-ers
This commit is contained in:
parent
c305dba649
commit
88fc9a979f
57
collects/racket/private/member.rkt
Normal file
57
collects/racket/private/member.rkt
Normal file
|
@ -0,0 +1,57 @@
|
|||
(module member '#%kernel
|
||||
(#%require "cond.rkt" "qq-and-or.rkt"
|
||||
(for-syntax '#%kernel "qq-and-or.rkt"))
|
||||
(#%provide memq memv member)
|
||||
|
||||
;; helper for memq/v/ber error cases
|
||||
(define-values (bad-list)
|
||||
(λ (who orig-l)
|
||||
(raise-mismatch-error who "not a proper list: " orig-l)))
|
||||
|
||||
(define-values (memq memv member)
|
||||
(let-values ()
|
||||
;; Create the mem functions
|
||||
(define-syntaxes (mk mk-member)
|
||||
(values
|
||||
(λ (stx)
|
||||
(define-values (forms) (syntax-e stx))
|
||||
(define-values (id eq?)
|
||||
(values (syntax-e (cadr forms))
|
||||
(syntax-e (caddr forms))))
|
||||
(datum->syntax
|
||||
stx
|
||||
`(let-values ([(,id)
|
||||
(lambda (v orig-l)
|
||||
(let loop ([ls orig-l])
|
||||
(cond
|
||||
[(null? ls) #f]
|
||||
[(not (pair? ls))
|
||||
(bad-list ',id orig-l)]
|
||||
[(,eq? v (car ls)) ls]
|
||||
[else (loop (cdr ls))])))])
|
||||
,id)))
|
||||
;; Create the `member` function that takes an extra argument
|
||||
;; Uses `mk` to construct the body
|
||||
(λ (stx)
|
||||
(define-values (forms) (syntax-e stx))
|
||||
(define-values (id) (syntax-e (cadr forms)))
|
||||
(datum->syntax
|
||||
stx
|
||||
`(let* ([default (mk member equal?)]
|
||||
[,id (case-lambda
|
||||
([v orig-l] (default v orig-l))
|
||||
([v orig-l eq?]
|
||||
(if (and (procedure? eq?)
|
||||
(procedure-arity-includes? eq? 2))
|
||||
(void)
|
||||
(raise-argument-error
|
||||
'member
|
||||
"(procedure-arity-includes/c 2)"
|
||||
eq?))
|
||||
((mk member eq?) v orig-l)))])
|
||||
,id)))))
|
||||
(values (mk memq eq?)
|
||||
(mk memv eqv?)
|
||||
;; Note that this uses `mk-member`
|
||||
(mk-member member)))))
|
||||
|
Loading…
Reference in New Issue
Block a user