abstracting away match in racket -
i have couple of functions matches structs such:
(define (get-bounding-y struct-lst) (flatten (for/list ([i struct-lst]) (match [(line _ _ _ _ _ y1 _ y2) (list y1 y2)] [(arc _ _ _ _ _ y radius _ _ _ _ _ _ _ _) (list (+ y radius) (- y radius))] [(point _ _ _ _ _ y) (list y)] [(path _ _ _ _ path-list) (get-bounding-y path-list)]))))
i abstract away function of structure
(matcher (struct-name1 return-value) (struct-name2 return-value) ...)
i.e. (matcher (line (+ 1 x1)) (arc radius) (point x) (path entities)) return this:
(match a-struct [(struct* line ([x1 x1])) (+ 1 x1)] [(struct* arc ([radius radius])) radius] [(struct* point ([x x])) x] [(struct* path ([entities entities])) entities])
is possible?
you can extend match
. custom patterns defined define-match-expander
.
let's have struct
(struct line (x1 y1 x2 y2))
and observe using match pattern
(line _ y1 _ y2)
over , over. prefer write
(line* y1 y2)
using define-match-expander
can turn (line* y1 y2)
(line _ y1 _ y2)
.
here complete example:
(define-match-expander line* (lambda (stx) (syntax-case stx () [(_line* y1 y2) #'(line _ y1 _ y2)]))) (match (line 0 1 2 3) [(line* y1 y2) (list y1 y2)])
the output is:
'(1 3)
Comments
Post a Comment