attempt to clarify define-match-expander behavior
(that confused me)
This commit is contained in:
parent
fca126bf01
commit
e744d07f5b
|
@ -564,15 +564,22 @@ A transformer produced by a second @racket[proc-expr] sub-expression is
|
||||||
second @racket[proc-expr], @racket[id] can be given meaning both
|
second @racket[proc-expr], @racket[id] can be given meaning both
|
||||||
inside and outside patterns.
|
inside and outside patterns.
|
||||||
|
|
||||||
|
Match expanders are not invoked unless @racket[id] appears in the first
|
||||||
|
position in a sequence. Instead, identifiers bound by @racket[define-match-expander]
|
||||||
|
are used as binding identifiers (like any other identifier) when they appear
|
||||||
|
anywhere except the first position in a sequence.
|
||||||
|
|
||||||
For example, to extend the pattern matcher and destructure syntax lists,
|
For example, to extend the pattern matcher and destructure syntax lists,
|
||||||
@defs+int[
|
@defs+int[
|
||||||
#:eval match-eval
|
#:eval match-eval
|
||||||
((define-match-expander syntax-list
|
((define (syntax-list? x)
|
||||||
|
(and (syntax? x)
|
||||||
|
(list? (syntax->list x))))
|
||||||
|
(define-match-expander syntax-list
|
||||||
(lambda (stx)
|
(lambda (stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[(_ elts ...)
|
[(_ elts ...)
|
||||||
#'(? (lambda (x) (and (syntax? x)
|
#'(? syntax-list?
|
||||||
(list? (syntax->list x))))
|
|
||||||
(app syntax->list (list elts ...)))])))
|
(app syntax->list (list elts ...)))])))
|
||||||
(define (make-keyword-predicate keyword)
|
(define (make-keyword-predicate keyword)
|
||||||
(lambda (stx)
|
(lambda (stx)
|
||||||
|
@ -595,6 +602,23 @@ For example, to extend the pattern matcher and destructure syntax lists,
|
||||||
(list "AAANND!" b c)])
|
(list "AAANND!" b c)])
|
||||||
]
|
]
|
||||||
|
|
||||||
|
And here is an example showing how
|
||||||
|
@racket[define-match-expander]-bound identifiers are
|
||||||
|
not treated specially unless they appear
|
||||||
|
in the first position of pattern sequence.
|
||||||
|
@defs+int[
|
||||||
|
#:eval match-eval
|
||||||
|
((define-match-expander nil
|
||||||
|
(λ (stx) #''())
|
||||||
|
(λ (stx) #''()))
|
||||||
|
(define (len l)
|
||||||
|
(match l
|
||||||
|
[nil 0]
|
||||||
|
[(cons hd tl) (+ 1 (len tl))])))
|
||||||
|
(len nil)
|
||||||
|
(len (cons 1 nil))
|
||||||
|
(len (cons 1 (cons 2 nil)))]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@defthing[prop:match-expander struct-type-property?]{
|
@defthing[prop:match-expander struct-type-property?]{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user