2024年Clojure状态调查中分享你的想法!

欢迎!请参阅关于页面了解更多关于这是如何工作的信息。

+1
编译器

编译器不会对特殊的let绑定(或def)之声进行抱怨,但绑定仅在它们不在列表开头使用时才有效

这些是有效的

(let [try :a] try) => :a (let [try (constantly :a)] (apply try :b)) => :a

这不可行

(let [try (constantly :a)] (try :b)) => :b

这适用于所有特殊符号,不仅仅是像try和new这样的公开可用的符号,也适用于像fn**这样的内部符号。

我期望行为一致:要么编译器根本不允许特殊符号的阴影,要么在所有情况下阴影都起作用。

6 答案

0

由:bronsa

我认为阴影特殊符号不是一个好主意,但如果所有的特殊符号都具有命名空间限定符(目前只有clojure.core/import*是ns-qualified)以及首先在局部环境中检查符号然后回退到特殊符号映射,可能会在那个场景中有所帮助

0

由:oakley jurgens

我认为阴影特殊符号不是一个好主意。如果这是可能的,我们就必须更改大多数clojure.core中的宏以确保它们安全(即,在每个特殊符号的使用处显式添加命名空间)。我们如何处理不是实现专有的特殊符号,如try和new?每个使用它们的第三方宏都可能变得不安全。

我个人的偏好是禁止特殊符号的阴影。

0

由:bronsa

这不会发生,因为我在提议的包括让语法引号了解命名空间的特殊符号。
`def 将扩展为 'clojure.core/def 例如。

0

由:oakley jurgens

这是真的,但是宏不必使用语法引号。以 when 的定义为例。

0
参考: https://clojure.atlassian.net/browse/CLJ-1411(由 alex+import 报告)
0

编写一个“修复”来抛出如果 var 或局部会阴影特殊符号,出乎意料地并不太糟糕。然而,仅仅在 clojure 本身就有许多 varnew 以及其他在 let 绑定中使用的例子。

也许不抛出错误,而是打印出某种:“警告:阴影特殊符号是很糟糕的,不应该这样做!”这已经在定义新变量或在 let 绑定中做到过几次了。

是的,您不想抛出错误,它会破坏向后兼容性。您可能还想要将其关闭,就像 *warn-on-reflection*。
我觉得这样看起来是正确的。我将尝试使用另一种方法,比如`*warn-on-shadowed-specials*`,看看感觉怎么样。
...