F: Warum hat elisp keine Namespaces und wie können wir sie bekommen?
Elisp hat keine anderen Namespaces als den globalen, was zu der Kodierungskonvention geführt hat, dass allen globalen Funktionen, Variablen und Konstanten ein eindeutiges Präfix vorangestellt wird.
Abgesehen von dem Ärgerfaktor scheint es mir auch ein Problem zu sein, das angesichts 1) der ständig wachsenden Anzahl großartiger Bibliotheken und Pakete und 2) der fortbestehenden Existenz von Legacy-Funktionen und -Variablen, die entweder die Präfixkonvention nicht respektieren, oder sind so eigenwillig, dass es keine wirklich gute Präfixoption gibt, die sie verwenden könnten. Dies bedeutet auch, dass regelmäßige Versuche, älteren Code (wie beim Übergang von cl
nach cl-lib
) zu rationalisieren, nicht trivial sind. (Obwohl ich für das Aufräumen froh bin, vergieße ich trotzdem jedes Mal eine Träne, wenn ich so etwas schreibe cl-find
).
Ich stöberte herum, um herauszufinden, warum elisp nach einigen Jahrzehnten der Nutzung immer noch keine Namespaces hat, war aber ein wenig überrascht über die bescheidene Ernte. Die Wiki-Seite zu Namespaces ist recht kurz. Nic Ferrier hat eine etwas längere Behandlung des Problems und es gibt auch einen relativ neuen Thread über Emacs-Entwicklung . Es gibt einen alten Stapelüberlauf-Thread aus dem Jahr 2010, in dem die Möglichkeit der Verwendung von Makros zum Implementieren von Namespaces erörtert wird. Ein weiteres Beispiel für den Makroansatz finden Sie hier . Es gibt mindestens ein paar Implementierungen ( hier und hier , mit einer Beschreibung der letzteren hier) da draußen, aber sie haben seit ein paar Jahren nicht mehr viel Aktivität gesehen, und ich bin nicht auf Bibliotheken gestoßen, die sie verwenden.
Ich nehme an, wenn das Hinzufügen von Namespaces einfach wäre, wäre dies bereits erledigt. Damit:
- Was sind die technischen Hindernisse für das Hinzufügen von Namespaces zu elisp?
- Würde das Hinzufügen von Namespaces einen Großteil des vorhandenen Codes beschädigen?
- Muss diese Funktionalität organisch sein (Änderungen am Interpreter selbst), oder kann sie wirklich über Makros aufgebaut werden?
Antworten:
Warum keine Namespaces?
Weil es kompliziert ist und niemand es für dringend genug gehalten hat, den vollen Sprung noch zu wagen. Dies wurde bereits in der Dev-Liste diskutiert (mehrmals), und es wurde versprochen, dies nach dem Wechsel zu Git zu beheben.
In der Zwischenzeit habe ich eine eigene Lösung geschrieben (siehe unten für eine Liste von Optionen).
Was sind die technischen Hindernisse?
Im Freien gibt es drei große Hindernisse, die Sie überwinden müssen, damit Namespaces sogar die Möglichkeit haben, an einem aktuellen Emacs zu arbeiten:
package.el
muss Namespaces verstehen.Es ist nicht trivial, diese drei Dinge zu patchen, um damit zu arbeiten, wie auch immer Sie kommen, um Namespaces zu implementieren. Wenn Sie sich nur der neuesten Emacs-Version widmen, können Sie dies auf jeden Fall tun. Wenn Sie eine Art Paket schreiben möchten, das auch frühere Versionen unterstützt (wie die gesamte 24er-Familie), wird dies zu einer echten Herausforderung.
Darüber hinaus gibt es Tonnen von anderen optionalen Hindernissen. Elisp ist großartig, weil die verfügbaren Tools so leistungsfähig sind, dass ALLE diese gepatcht werden müssten, um mit Namespaces zu arbeiten. Zu den wichtigsten gehören:
Würde es viel vorhandenen Code brechen?
Nicht, wenn du es richtig machst.
Ist das etwas, das organisch sein muss, oder könnte es wirklich über Makros aufgebaut werden?
Idealerweise wäre es organisch, das wird normalerweise diskutiert, wenn es in der Entwicklerliste auftaucht. Aber es kann gut genug gemacht werden, während es oben gebaut wird.
Hier einige Beispiele aus dieser Liste :
quelle
names
Lösung. Ich frage mich, ob es irgendeinen Grund gibt, zu vermuten, dass eine organische, integrierte Lösung in nicht allzu ferner Zukunft verfügbar sein wird, oder ob wir einfach die von Ihnen bereitgestellte integrierte Lösung übernehmen sollten .nameless
diese Liste wirklich ergänzen :) Es ist eine brillante Idee und löst das Problem sehr ordentlich.Als dies das letzte Mal auf emacs-devel diskutiert wurde, hörte die Diskussion auf, als Leute wie Lars darauf hinwiesen, dass sie gerne in der Lage sind,
M-x grep
etwas zu tun . Das Hinzufügen von Namespaces zu Elisp sollte nicht allzu schwierig sein, aber es ist ein weiteres Problem, alle vertrauten Tools zu verwenden, um sie richtig zu handhaben.quelle