Hi.
I'm developing a simple pattern matching library for clojure but I am
having
trouble with macros (which I have almost zero experience with).
I have a function `make-matcher`
(make-matcher <pattern>)
which returns a function that can pattern match on data and returns a
map of bindings (or nil in case of a non-match).
((make-matcher '(list x y z w)) (list 1 2 3 4))
; => {x 1 y 2 z 3 w 4}
((make-matcher '(list x y z x)) (list 1 2 3 4))
; => nil
((make-matcher '(list 1 x 2 _)) (list 1 2 3 4))
; => nil
((make-matcher '(list 1 x 2 _)) (list 1 3 2 9))
; => {x 3}
I have been trying to write the following 'match' macro:
(match <data>
<pattern-1> <body-1>
<pattern-2> <body-2>)
The macro should work like this:
(match (list 1 2 3)
(list 1 x) (+ x x)
(list 1 x y) (+ x y))
; => 5
I have the following macros (none of which works correctly):
; (letmap {a 1 b 2} (+ a b))
; =(should) expand to=>
; (let [a 1 b 2] (+ a b))
(defmacro letmap [dict & body]
`(let ~(into [] (reduce concat (eval dict)))
(do ~...@body)))
; (match (list 1 2 3)
; (list 1 x) (+ x x)
; (list 1 x y) (+ x y))
; =should expand to something like=>
; (let [dict (<matcher..> (list 1 2 3))]
; (if dict
; (letmap dict (+ 1 x))
; (match (list 1 2 3) (list 1 x y) (+ x y))))
(defmacro match [data & clauses]
(when clauses
(let [pattern (first clauses)
body (second clauses)
matcher (make-matcher pattern)]
`(let [dict# (~matcher ~data)]
(if dict#
(letmap dict# ~body)
(match ~data (next (next ~clauses))))))))
Any help is appreciated. Also pointers to documents and books where I
can
learn more about macros.
Thanks.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---