In Clojure, wenn Sie eine Funktion vor ihrer Definition aufrufen, z. B.
%Vor%es ist nicht kompiliert. Man sollte hinzufügen
%Vor% vor (foo (bar 'a))
. Warum ist Clojure so konzipiert? Ich meine, in den meisten Sprachen außer C / C ++, wie Java, Python, PHP, Scala, Haskell oder sogar anderen Lisps, insbesondere in dynamischen Sprachen, ist keine Funktionsdeklaration erforderlich, das heißt, die Funktionsdefinition könnte auch gesetzt werden vor oder nach einem Anruf. Ich fühle mich unwohl zu benutzen.
Clojure macht eine Single-Pass-Kompilierung (gut, ich vereinfache, lesen Sie die folgenden Links):
Es scheint also logisch zu sein, dass man, wenn man die Quelle nur einmal liest, von oben nach unten keine Dinge wie forward declaration und sicher machen kann.
Um Rich (erster Link) zu zitieren:
Aber was soll hier passieren, wenn der Compiler noch nie gesehen hat? Bar?
%Vor%oder in CL:
%Vor%CL kompiliert sie glücklich, und wenn Balken nie definiert wird, wird ein Laufzeitfehler auftreten. Ok, aber was für eine verdinglichte Sache (Symbol) Hat es während der Kompilierung für den Balken verwendet? Das Symbol, das es interniert hat wenn das Formular gelesen wurde. Also, was passiert, wenn Sie die Laufzeit bekommen Fehler und erkennen, dass Bar in einem anderen Paket definiert ist, das Sie vergessen haben einführen. Sie versuchen, andere Paket und BAM !, einen anderen Fehler zu importieren - Konflikt, other-Paket: Konflikt mit dem eingelesenen Paket: bar. Dann du lernst etwas über das Unintern lernen.
In Clojure wird das Formular nicht kompiliert, Sie erhalten eine Nachricht, und keine Variable ist für die Bar interniert. Du benötigst Other-Namespace und weiter.
Ich bevorzuge diese Erfahrung und so machte diese Kompromisse. Viele andere Vorteile kamen von der Verwendung eines Nicht-Internierter Leser und Internieren nur auf Definition / Deklaration. Ich bin nicht geneigt, sie aufzugeben, noch die oben erwähnten Vorteile, um Zirkelbezug zu unterstützen.
Tags und Links clojure