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

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

+1
Clojure

当rename-keys位于clojure.set命名空间时,由于其作用于map而不是set,因此很难找到。而且,在阅读代码时,看起来像set/rename-keys也有些奇怪,但这被认为是引入clojure.set命名空间的优选方式。

这是我希望在Clojure 2.0中看到的一些小问题之一。

9 回答

+2

评论者:marc

我们不会删除/移动现有变量,因为这会破坏现有的程序。

根据Gordon的建议,可以通过删除来解决这个问题

可以在{{clojure.core}}中添加一个新的变量,名为{{clojure.core/rename-keys}}。然后可以按以下方式定义{{clojure.set}}中的{{rename-keys}}变量

(def rename-keys clojure.core/rename-keys)

0

评论者:gordonsyme

不仅仅{{rename-keys}}有问题,实际上有少数几个函数在{{clojure.set}}中也没有任何意义,至少乍一看是这样。

这无疑会降低这些函数的可发现性。

我在日常工作中至少遇到过一次{{rename-keys}}和{{map-invert}}的重实现,因为作者不知道这些函数存在。

我认为应该将关系和映射函数从 {{clojure.set}} 中独立出来,放入它们自己的命名空间中,并在 {{clojure.set}} 中定义一些变量以保持向后兼容性。
这些兼容性变量可以在 1.10 中删除。

我愿意这样做(或另一种方法),但首先希望核心团队对此方法表示认同。

0

评论者:bronsa

我认为这种情况根本不可能发生

0

评论者:alexmiller

我们不会删除/移动现有变量,因为这会破坏现有的程序。

0

评论者:alexmiller

我知道这一点,这就是为什么我没有关闭这个问题。我只是陈述了一个可能的解决方案。

0

评论者:bozhidar

出于好奇——有人知道这些函数为什么最终出现在 clojure.set 命名空间中吗?

P.S. 如果有人决定在命名空间之间创建别名,我建议创建一个 clojure.map 命名空间,而不是将更多的东西添加到核心。

0

评论者:hiredman

根据其内容,clojure.set 的一个更准确的名称可能是 clojure.relational-algebra,其中它定义了类似于关系代数在映射集合上的操作,而不是在元组集合上的操作。这种情况下的一个常见操作是在映射中重命名键(类似于在 SQL 查询中使用 AS)。这正是 rename-keys 出现在 clojure.set 中的原因。

0

评论者:jafingerhut

Bozhidar - 这只是一个猜测,没有知识。关系是记录/元组的集合,所以对我来说,将这些关系上的函数放在 clojure.set 中有些道理。rename-keys 暴露在那里,可能是因为它被两个操作关系的函数所使用。

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