Shadowing bindings does not work as expected

Description

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

This code:

```
(let [foo [:bar :baz]]
(match foo
[:bar boo] boo
:else :got-else))
```

returns `:baz`. While this code:

```
(let [foo [:bar :baz]]
(match foo
[: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

Environment

None

Activity

Show:
Greg Chapman
April 7, 2018, 6:26 PM

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:

Assignee

David Nolen

Reporter

import

Labels

None

Approval

None

Patch

None

Priority

Critical