请分享您的想法:2024年Clojure状态调查!

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

+1
编译器

编译器不会对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**这样的内部符号。

我期望行为一致:编译器要么完全不允许对特殊符号进行阴影,要么在任何情况下都能进行阴影。

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](https://clojure.atlassian.net/browse/CLJ-1411)(由alex+import报告)
0

编写这个“修复”抛出错误以指示变量或局部是否会影响特殊符号,出乎意料地并不太糟糕。然而,仅在 clojure 自己中就有许多使用在 let 绑定中的 varnew 等实例。

也许不是抛出错误,而应该打印一些信息:“WARNING: 封影特殊符号是不良的,并且不应这样做!”在定义新变量或者在 let 绑定时,这已经在几个地方做了。

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