Clojure: Warum sollte eine Funktion 'deklarieren' sein, wenn sie vor der Definition im Quelltext aufgerufen wird?

10

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.

    
nanoix9 15.10.2015, 08:49
quelle

1 Antwort

15

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.

    
nha 15.10.2015, 09:01
quelle

Tags und Links