2012-06-14 9 views
8

Warum verwenden Clojure-Bibliotheken häufig vorkommende Funktionsnamen, sodass Sie gezwungen sind, sie zu Namespace zu qualifizieren? Zum Beispiel verwendet clojure.zip next, ersetzt und entfernt , die bereits in clojure core existieren und "replace" existiert bereits in clojure.string.Warum Clojure-Bibliotheken nicht versuchen, eindeutige Namen für allgemeine Funktionsnamen zu verwenden

Jetzt wird der Entwickler wahrscheinlich eine Abkürzung für den clojure.zip-Namespace verwenden, so dass in einem Entwicklercode der clojure.zip/next als z/next im Code einer anderen Person als w/next, etc Dies wird Sie zwingen, zurück zu schauen, um zu sehen, was die Namensraumabkürzung tatsächlich ist, weil der Entwickler eine eigene Bibliothek erstellt haben könnte, die auch die Funktion "next" verwendet

Warum nicht zip-next, zip-replace, und zip-remove, str-ersetzen? Oder so ähnlich

Dann wird es eine konsistente "Namespace-Qualifikation" im Code der Leute geben und es wird klar sein, worauf sich diese Funktionen beziehen.

Es ist nicht wie es gibt Hunderte von Namen Zusammenstöße zwischen Bibliotheken. Normalerweise sehe ich nur zwei oder drei. Ist es so schwer, diese Namen für die Bibliothek explizit zu machen?

Antwort

20

Im Allgemeinen use mit Bibliotheken enthalten ist weniger populär als require in normaler Verwendung clojure Code suchen, so länger eindeutige Namen verwendet, ist weniger nützlich, wenn der Namespace bereits die gleiche Bedeutung vermittelt so Clojure Programmierer Kürze bevorzugen neigen zur Einzigartigkeit.

statt:

(use 'liba 'libb) 

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

Menschen könnten dann schreiben:

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

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

die die liba- scheinen dumm macht, also:

(a/foo 1 2 3) 
(b/foo 1 2 3) 
+1

Ich mag die Tatsache, dass Sie einen kürzeren Alias ​​für einen Namespace verwenden können. Gibt dir viel mehr Power, was ein häufiges Thema in Clojure ist. Dies kann jedoch ein Problem darstellen, wenn einige Programmierer unangemessene Aliase oder sogar längere Aliase als den ursprünglichen Namespace verwenden. – adamjmarkham

+1

Ich verstehe Ihren CL-Kommentar nicht wirklich. Es gibt viele sehr kurze Namen in CL und die langen scheinen nicht mit Namensräumen zu tun zu haben. –

+0

Ich muss zugeben, dass Kommentar kommt von meinem persönlichen Frust mit ein paar Bibliotheken. Sorry CL Leute, ich werde nett spielen :-( –

9

Wenn Sie vorhaben, zu verlangen, diese Namen sind global einzigartig, warum überhaupt Namensräume? Wenn ich die Eiscremebibliothek definiere und jedem Funktionsnamen Eiscreme vorantreibe, kann niemand Konflikte verursachen.

Aber das ist furchtbar ungünstig für beide Seiten - wir müssen immer wieder dieses dumme Präfix eingeben. Wenn ich anstelle von Icecream-Scoop einfach meinen Funktions-Scoop im Namespace-Icecream benenne, hast du die Wahl, wie du darauf Bezug nehmen kannst: Du kannst es Scoop nennen, wenn es aus dem Kontext herausragt und nicht mit deinem Namespace oder Icecream kollidiert. Schaufel, oder Dessert/Schaufel, was auch immer Sie brauchen, damit es gut lesen.

+0

Diese Funktionsnamen wie replace, remove, reverse sind so häufig, dass Sie nicht sagen können, was sie bedeuten, wenn sie nicht Namespace-qualifiziert sind. Daher MÜSSEN Sie einen Space benennen, um sie zu qualifizieren. Sie können nicht einfach "Ersetzen" in Ihrem Code verwenden, Sie werden jetzt, was es bedeutet, aber andere Leute werden nicht und sie müssen anhalten und herausfinden, zu welchem ​​Namensraum es gehört. Aber jetzt haben die Leute die Wahl, den Namensraum zu qualifizieren, egal was abrev ist, so dass es verwirrend wird. Wenn sie Namespace sind, der zum Beispiel als str-replace qualifiziert ist, wäre dies in jedem Code klar. –

+0

Und ich sage nicht, ein Präfix ALLEN Funktionen in einer Bibliothek hinzuzufügen. Nur für solche Funktionen, deren allgemeine Namen mit Funktionen in anderen Namespaces kollidieren. Wie ersetzen, reverse, etc. Diese sind so häufig sie sind garantiert zu Konflikt –

+0

Also dann hat meine 'icecream' Bibliothek Funktionen Schaufel, Geschmack, Geschmack und Eiscreme entfernen? Das ist schrecklich für die Konsistenz - der Benutzer muss sich daran erinnern, welche Funktionen ein Präfix im Namen haben und welche nicht. Ich möchte nicht "Join" und "Str-Replace" nennen; 'str/join' und' str/replace' sind einfacher zu schreiben und leichter zu lesen. – amalloy