8

为什么 clojure 库会重用经常出现的函数名称,从而迫使您对它们进行命名空间限定?例如 clojure.zip 使用 next、replace 和 remove 已经存在于 clojure core 和“replace”已经存在于 clojure.string 中。

现在开发人员可能会为 clojure.zip 命名空间使用一些缩写,因此在一个开发人员的代码中,clojure.zip/next 将是命名空间限定为 z/next 在另一个人的代码中为 w/next 等。这将迫使你回头看看名称空间缩写实际上是什么,因为开发人员可以创建自己的库,该库也使用函数“next”

为什么不使用 zip-next、zip-replace 和 zip-remove、str-replace?或类似的东西

然后在人们的代码中会有一个一致的“命名空间限定”,这些函数指的是什么就很清楚了。

这不像图书馆之间有数百个名称冲突。我通常只看到两三个。明确地使这些名称对图书馆来说是独一无二的吗?

4

2 回答 2

20

一般来说,使用use包含库不如在正常外观的 clojure 代码中使用,因此当require命名空间已经传达相同的含义时,使用较长的唯一名称不太有用,因此 clojure 程序员倾向于简洁而不是唯一性。

代替:

(use 'liba 'libb)

(liba-foo 1 2 3)
(libb-foo 1 2 2)

然后人们可以写:

(require ['liba :as 'a] [libb :as 'b] )

(a/liba-foo 1 2 3)
(b/libb-foo 1 2 3)

这使得 liba- 看起来很傻,因此:

(a/foo 1 2 3)
(b/foo 1 2 3)
于 2012-06-14T18:02:07.373 回答
9

如果您要要求名称是全局唯一的,那为什么还要使用名称空间呢?如果我定义了 icecream 库,并在每个函数名称前加上 icecream,那么没有人会发生冲突。

但这对双方来说都非常不方便——我们都必须一遍又一遍地输入这个愚蠢的前缀。如果不是 icecream-scoop,我只是在命名空间 icecream 中命名我的函数 scoop,你可以选择如何引用它:如果从上下文中清楚并且不与你的命名空间或 icecream/ 冲突,你可以将其命名为 scoop勺子,或甜点/勺子,无论你需要什么让它读起来都很好。

于 2012-06-14T18:59:51.453 回答