The compiler does not complain about let binding (or def-ing) special symbols, but the binding only works if not used at the beginning of a list:
These work:
(let [try :a]
try)
=> :a
(let [try (constantly :a)]
(apply try :b))
=> :a
This doesn't work:
(let [try (constantly :a)]
(try :b))
=> :b
This is true for all special symbols, not just publicly exposed ones like try and new, but also internal ones like fn**.
I would expect consistent behaviour: either the compiler does not permit shadowing special symbols at all, or shadowing them works in all cases.