Hi,
I've recently started using the matchure library for pattern matching
(https://github.com/dcolthorp/matchure).
Basically, I'd like match a number of different values and bind the
first match to a symbol. In matchure, binding to a variable can be
done like this:
(if-match [(and ?c "Hi") "Hi"] c) ; Will return "Hi"
I have a map:
(def *chars* { "Grace" :Grace
"grace" :Grace
"Trip" :Trip
"trip" :Trip})
And I'd like to produce something like this:
(if-match [(or
(and ?c #"Grace")
(and ?c #"grace")
(and ?c #"Trip")
(and ?c #"trip"))
"Trip"]
c)
>From something like this:
(if-match [(match-character ?c) "Trip"] c)
Currently, I have the following macro:
(defmacro match-character
"Creates a pattern-matching OR that binds the provided symbol
to the first matched name."
[x]
`(or
~@(map
(fn [[k _]]
`(and ~x ~(re-pattern k)))
*chars*)))
It produces the following code after macroexpand-1:
(clojure.core/or (clojure.core/and ?c #"trip") (clojure.core/and ?c
#"Trip") (clojure.core/and ?c #"Grace") (clojure.core/and ?c
#"grace"))
Which is exactly what I want. However, when I use it in the context I
want, it goes too far and tries to evaluate ?c. Is there a way to
just have it splice-in the code, or would I need another macro to do
that?
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