为什么clojure库会重复使用常见的函数名称 命名空间限定了他们? 例如,clojure.zip使用next,replace和remove 已经存在于clojure核心中并且“替换”已经存在于clojure.string中。
现在开发人员可能会使用clojure.zip命名空间的一些缩写 所以在一个开发人员的代码中,clojure.zip/next将命名空间限定为z / next,在另一个人的代码中为w / next等。这将迫使你回头看看 名称空间缩写实际上是什么,因为开发人员可以创建自己的库,该库也使用“next”函数
为什么不进行zip-next,zip-replace和zip-remove,str-replace?或类似的东西
然后在人们的代码中会有一致的“名称空间限定”,并且很清楚这些函数所指的是什么。
并不是说库之间存在名称冲突的趋势。我通常只看到两三个。是否难以明确地将这些名称作为图书馆的独特之处?
答案 0 :(得分: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)
答案 1 :(得分:9)
如果您要求名称全局唯一,为什么要使用名称空间?如果我定义冰淇淋库,并用冰淇淋为每个函数名称加前缀,那么任何人都不会发生冲突。
但这对双方都非常不方便 - 我们都要一遍又一遍地输入这个愚蠢的前缀。如果不是icecream-scoop,我只是在命名空间icecream中命名我的函数scoop,你可以选择如何引用它:如果它从上下文中清楚并且不与你的命名空间冲突,你可以称之为scoop,或者icecream /勺子,或甜点/勺子,无论你需要什么,使它读得很好。