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:
+
) 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. 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. use
d leicht sein und Konflikte vermeiden, aber der Name ist ein bisschen hässlich und könnte schwer zu merken sein. 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?
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)
Tags und Links namespaces clojure dsl