(quote foo) should be interpreted as a literal match. I thought this was
addressed by a previous user submitted patch but it doesn't look like
that's true.
We currently use seqs as a marker of custom syntax, we dispatch either on
the first or second element of the seq. For example this is how we handle
or:
(defmethod emit-pattern-for-syntax [:or Object]
[pat] (or-pattern
(->> pat
(map emit-pattern)
(into []))))
So you need to add a new case - [quote Object], and emit a literal pattern.
Feel free to open a ticket in JIRA. Patch welcome!
David
On Wed, Nov 30, 2011 at 2:49 PM, Alex Miller <[email protected]> wrote:
> I've been working with core.match some this week and finding it pretty
> nice. However, I have a common case (for me) that is not well handled
> right now via core.match: matching symbols. Say that I wrote a match
> like this:
>
> ;; translate (+ x (+ y z)) to (+ x y z)
> (let [e '(+ 1 (+ 2 3))]
> (match [e]
> [([+ x ([+ y z] :seq)] :seq)] (+ x y z)))
>
> You will see this error:
> Pattern row 1: Pattern row reuses wildcards in [([+ x ([+ y
> z] :seq)] :seq)]. The following wildcards are ambiguous: +. There's
> no guarantee that the matched values will be same. Rename the
> occurrences uniquely.
>
> Any symbol inside a pattern row is treated as a bind variable. + is a
> symbol. You can achieve this with guards:
>
> (defn +? [s] (= '+ s))
>
> (let [e '(+ 1 (+ 2 3))]
> (match ['(+ 1 (+ 2 3))]
> [([(_o1 :when +?) x ([(_o2 :when +?) y z] :seq)] :seq)] (list
> '+ x y z)))
>
> but, yuck. I can imagine using the reserved ()'s with additional keys
> (:symbol or :sym) to do symbol matching like (:symbol +) but also,
> yuck. The simplest idea I came up with was:
>
> (let [e '(+ 1 (+ 2 3))]
> (match [e]
> [(['+ x (['+ y z] :seq)] :seq)] ('+ x y z)))
>
> These come through as (quote x) although the error reporting goes a
> little off the rails:
> Pattern row 1: Pattern row reuses wildcards in [([(quote +) x ([(quote
> +) y z] :seq)] :seq)]. The following wildcards are ambiguous: quote.
> There's no guarantee that the matched values will be same. Rename the
> occurrences uniquely.
>
> However, that seems fixable and you could then use (quote x) as a
> signal to do symbol matching. If I can figure out what the hell I'm
> doing in core.match then I'd be happy to work on a patch.
>
> Thoughts?
>
> --
> 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
--
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