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* 是目前唯一具有命名空间限定的)以及首先检查局部环境中的符号,之后在特殊符号映射后回退,可能会在这些情况下有所帮助。

0

评论由:oakley jurgens 发表

我认为影射特殊符号是一个坏主意。如果这成为可能,我们将不得不将 clojure.core 中的大多数宏改为使其安全(也就是说,在特殊符号的使用处显式添加一个命名空间)。我们如何处理像 try 和 new 这样的不仅针对实现特定的特殊符号?每一个使用这些的第三方宏都可能变得不安全。

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

0

评论由:bronsa 发表

情况不会是这样的,因为我提出的方案包括使语法引用cw对命名空间特殊符号有所了解。
例如,`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本身中就有许多varnew等实例被用在了let绑定中。

也许不是抛出错误,而应该打印以下内容:“警告:掩盖特殊符号是不良的,不应这样做!”这已经在定义新变量或在let绑定时的几个地方实现了。

是的,你不想抛出错误,这会破坏与以前版本的兼容性。你也可能想要将其关闭,就像 *warn-on-reflection*。
这在对我来说似乎是正确的。我将尝试一个替代方案,比如`*warn-on-shadowed-specials*`,看看感觉如何。
...