This seems like a good use for a macro. A couple of thoughts: 1. Use arrays instead of lists In clojure, it is "best practice" to use arrays for data. So, your macro call should look like this.
(match [1 2 3] [1 x] (+ x x) [1 x y] (+ x y)) 2. Could you post the source to match maker? That would help my play around in a REPL 3. As for books go, get yourself a copy of "Programming Clojure" by Stuart Holloway Sean On Jul 8, 11:42 am, Jonas <jonas.enl...@gmail.com> wrote: > 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 clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---