编译器不会对特殊符号的 let 绑定(或 def-ing)提出抱怨,但是绑定只在列表开头不被使用时才有效。
这些是可以工作的
(let [try :a] try) => :a (let [try (constantly :a)] (apply try :b)) => :a
这个不行
(let [try (constantly :a)] (try :b)) => :b
这适用于所有特殊符号,而不仅仅是像 try 和 new 这样的公开符号,还包括像 fn** 这样的内部符号。
我期望有规律的行为:编译器根本上不允许遮挡特殊符号,或者在所有情况下都能发挥作用。