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*命名空间限定),

0

评论者:oakley jurgens

我认为阴影特殊符号是一个坏主意。如果这是可能的,我们就必须更改clojure.core中的大多数宏以使它们安全(即显式地为每个特殊符号使用添加命名空间)。我们将如何处理并非仅针对实现特定,如trynew的特殊符号?使用这些的每个第三方宏都可能变得不安全。

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

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

为了解决这个问题,抛出错误以如果变量或局部要阴影特殊符号,出乎意料地并不太糟。然而,just in clojure itself there are many instances of var and new and others used in let bindings.

也许不再抛出错误,而是打印一些内容:"警告:覆盖特殊符号是不礼貌的,不应该这么做!" 这已经在定义新变量或 let 绑定时在几个地方完成了。

是的,你不希望抛出异常,这样会破坏向后兼容性。你可能还想像 *warn-on-reflection* 一样将其关闭。
by
我觉得这似乎是对的。我会尝试另一个方案,可能是`*warn-on-shadowed-specials*`,看看感觉如何。
...