8

なぜ clojure ライブラリはよく使われる関数名を再利用して名前空間修飾を強制するのですか? たとえば、clojure.zip は、既に clojure コアに存在する next、replace、remove を使用し、「replace」は既に clojure.string に存在します。

現在、開発者はおそらく clojure.zip 名前空間に何らかの省略形を使用するため、ある開発者のコ​​ードでは clojure.zip/next は z/next として修飾された名前空間になり、別の人のコードでは w/next などになります。開発者が関数「next」を使用する独自のライブラリを作成した可能性があるため、実際の名前空間の略語を確認する

zip-next、zip-replace、および zip-remove、str-replace を使用しないのはなぜですか? またはそのようなもの

次に、人々のコードに一貫した「名前空間修飾」があり、これらの関数が何を参照しているかが明確になります。

ライブラリ間で何百もの名前の衝突があるわけではありません。通常は 2 つまたは 3 つしか表示されません。これらの名前を明示的にライブラリ固有のものにするのは難しいですか?

4

2 に答える 2

20

一般に、ライブラリをインクルードするために使用userequireすることは、通常の clojure コードで使用する場合よりも一般的ではありません。そのため、名前空間が既に同じ意味を伝えている場合、長い一意の名前を使用してもあまり役に立ちません。そのため、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 に答える