2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看 关于 页面,了解更多关于如何使用本站的信息。

+1 投票
编译器

编译器不会对新引用的特殊符号(或 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** 等特殊符号。

我希望有统一的特性:要么编译器根本不允许阴影特殊符号,要么阴影它们在所有情况下都有效。

6 个答案

0 投票

由:bronsa评论

我认为阴影特殊符号不是好主意,但可能需要所有特殊符号都有命名空间限定(目前只有 clojure.core/import* 有命名空间限定)并首先检查本地环境中的符号,然后回退到特殊符号映射,可能有助于这些场景。

0 投票

由:oakley jurgens评论

我认为阴影特殊符号是不好的主意。如果这是可能的,我们就必须更改 clojure.core 中的大多数宏以使其安全(即明确在每个特殊符号的使用中添加命名空间)。我们如何处理像 trynew 这种不仅是实现特定的特殊符号?每个使用它们的第三方宏都可能会变得不安全。

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

0 投票

由:bronsa评论

情况不会是这样,因为我提出的方案包括了让语法定义了解命名空间特殊符号。
例如,`def 会扩展为 'clojure.core/def。

0 投票

由:oakley jurgens评论

这确实如此,但宏并不一定需要使用语法定义。以 when 的定义为例。

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

编写一个“修复”来抛出一个错误,如果变量或局部变量会隐藏特殊符号,结果令人惊讶地相当不错。然而,在 clojure 本身中就有很多实例使用 varnew 以及其他在 let 绑定中使用的符号。

也许最好不要抛出错误,而应该打印一些信息:“警告:隐藏特殊符号是不良行为,不应该这样做!”这在定义新变量或在 let 绑定中已经实施。

是的,你不希望抛出错误,这将破坏向下兼容性。你也许还希望将其关闭,就像 *warn-on-reflection*。
我认为看起来是对的。我将尝试一个替代方案,可能是 `*warn-on-shadowed-specials*`,看看感觉如何。
...