Vermeiden Sie Namenskonflikte in einer Clojure DSL

9

Als Nebenprojekt erstelle ich ein Clojure DSL für die Bildsynthese ( clisk ).

Ich bin ein wenig unsicher über den besten Ansatz zur Funktionsbenennung, wo ich Funktionen in der DSL habe, die Funktionen im Clojure-Kern analog sind, zum Beispiel die + -Funktion oder etwas ähnliches wird in meinem DSL zum additiven Schreiben benötigt Bilder / führen Vektor-Mathe-Operationen durch.

Soweit ich das sehen kann, gibt es ein paar Optionen:

  1. Verwende den gleichen Namen ( + ) in meinem eigenen Namensraum. Sieht im DSL-Code gut aus, überschreibt aber die clojure.core-Version, die Probleme verursachen kann. Leute könnten verwirrt werden.
  2. Verwenden Sie den gleichen Namen, aber verlangen Sie, dass er qualifiziert ist ( my-ns/+ ). Vermeidet Konflikte, verhindert jedoch, dass Benutzer den Namespace aus praktischen Gründen in den Namespace integrieren und sieht ein bisschen hässlich aus.
  3. Verwenden Sie einen anderen kurzen Namen, z. (%Code%). Kann use d leicht sein und Konflikte vermeiden, aber der Name ist ein bisschen hässlich und könnte schwer zu merken sein.
  4. Verwenden Sie einen anderen langen Namen, z. (%Code%). Ausführlich, aber beschreibend, keine Konflikte.
  5. Schließen Sie v+ aus und definieren Sie mit einer Multimethode use neu (wie georgeg vorschlägt).

Beispielcode könnte etwa so aussehen:

%Vor%

Was ist der beste / idiomatische Ansatz?

    
mikera 23.07.2012, 07:32
quelle

1 Antwort

4

Erstens erfordert das wiederholte Auftreten von Operatoren in einem Infix-Ausdruck eine nette Syntax, aber für ein Lisp mit der Präfix-Syntax halte ich das nicht für so wichtig. Es ist also nicht so ein Verbrechen, dass der Benutzer ein paar weitere Zeichen für einen expliziten Namespace eingibt. und clojure unterstützt Namespaces und Aliasing sehr gut. Es ist also sehr einfach für einen Benutzer, sein eigenes kurzes Präfix zu wählen: (x/+ ...) zum Beispiel.

Zweitens, wenn man sich die Reader-Dokumente anschaut , gibt es nicht viele nicht-alphanumerische Symbole, mit denen man spielen kann , so etwas wie :+ ist out. es gibt also keine "süße" Lösung - wenn Sie ein Präfix wählen, muss es ein Brief sein. das bedeutet etwas wie x+ - besser, um dem Benutzer einen Alias ​​zu einem Preis von einem Zeichen zu geben und x/+ zu haben.

also würde ich sagen: Core ignorieren, aber erwarte den Benutzer (:require .... :as ...) . Wenn sie Ihr Paket so sehr lieben, dass es Standard ist, dann können sie (:use ...) und Core explizit behandeln. aber Sie wählen ein Präfix für Operatoren scheint wie ein schlechter Kompromiss.

(und ich glaube nicht, dass ich eine Bibliothek gesehen habe, die Präfixe aus einem Buchstaben verwendet).

Eine andere Möglichkeit besteht darin, das obige und auch ein separates Paket mit langen Namen anstelle von Operatoren bereitzustellen (die einfach so definiert sind, dass sie mit den Werten im ursprünglichen Paket übereinstimmen). Wenn die Leute (:use ...) wollen, aber Konflikte vermeiden wollen, können sie das verwenden (aber was ist der Vorteil von (vector-add ...) über (vector/+ ...) ?)

und schließlich würde ich überprüfen, wie + implementiert ist, da, wenn bereits irgendeine Art von Dispatch auf Typen beinhaltet, dann macht Georgeks Kommentar sehr viel Sinn.

(mit "operator" oben meine ich nur ein einzelnes Zeichen, nicht-alphanumerisches Symbol)

    
andrew cooke 23.07.2012, 17:49
quelle

Tags und Links