Welcome! Please see the About page for a little more info on how this works.

0 votes
in core.match by

This is a bug with core.match, or (far less likely) with the macro expansion in Clojure.

This code:

`
(let (link: foo [:bar :baz)]
(match foo

(link: :bar boo) boo
:else :got-else))

`

returns :baz. While this code:

`
(let (link: foo [:bar :baz)]
(match foo

(link: :bar foo) foo
:else :got-else))

`

returns :got-else.

They should be equal, since the foo in the match should shadow the foo in
the let. In fact, when running macroexpand-1 on these forms, they only differ in
the gensym numbers and the letter f vs b in foo and bar.

I have created a repo that reproduces the bug:

https://github.com/magnars/bug-examples/tree/core-match-shadow-bindings

2 Answers

0 votes
by

Comment made by: glchapman

This is actually working as designed. core.match treats locally defined symbols (symbols which occur in the macro's &env) as literal expressions where the literal value is the evaluated symbol (to see this in match.clj, look for uses of the **locals** variable). Thus the match in your failing case is effectively:

(match foo [:bar [:bar :baz]] foo :else :got-else}

0 votes
by
Reference: https://clojure.atlassian.net/browse/MATCH-126 (reported by alex+import)
...