Frage

Dies ist ein Follow-up zu meiner vorherigen Frage auf Clojure statische Typisierung.

Ich suchte den Java-Quellcode für den Compiler und es gibt mehrere Orte, an denen sie den Wert von *warn-on-reflection* prüfen, aber wenn ich den folgenden Code kompilieren, erhalte ich nur einen Laufzeitfehler:

(defn div-2 [^String s] (/ 2 s))

Gibt es Umstände, unter denen dieser Code sollte nicht Geben Sie eine Kompilierung-Warnung (es nicht)? Wie schwierig wäre es den Compiler eine Warnung auf dem folgenden Code geben:

(defn get-length [^String s] (.length s))
(defn test-get-length [] (get-length 2.0))

Danke.

War es hilfreich?

Lösung

Das Problem ist, dass der Compiler den Typ nicht verfolgt von def'd Vars. Also ja, in Ihrem einfachen Beispiel wäre es möglich sein. Aber wie oft passieren Sie eine wörtliche? In seltenen Fällen in einem realen Programm.

Machen Arten „durchströmen“, wie sie in einer realen statisch typisierte Sprache tun würde eine umfangreiche Menge an Nacharbeit erfordern. Sie müßten Typ Informationen über Vars verfolgen, dynamisch Vars, Dereferenzierungen Rebound, etc. Und dann Sie noch , die Ausgabe von Artikeln aus Sammlungen / Sequenzen ziehen, welche Arten genericized schon sagt, die a große Dose Würmer ...

Typ Anmerkungen in Clojure bestimmt waren nie Typsicherheit bei der Kompilierung zur Verfügung zu stellen - (. Auf Kosten einen Laufzeitfehlers, wenn eine unerwartete Art angetroffen wird) sie erlaubt nur die Compiler mehr optimierte Code zu generieren

instrumentiert die Compiler mit voller statischer Typisierung Informationen könnte möglich sein, aber an diesem Punkt haben Sie weitgehend die Sprache neu geschrieben, und Sie hatten zu viele Entscheidungen und Abwägungen, wie Typen behandelt werden. Es wäre wirklich nicht Clojure mehr.

Andere Tipps

Anstatt zu versuchen, den Compiler zu ändern, warum nicht ein separates Tool schreiben, dass nur eine Datei Clojure Code scannt und warnt vor Typ Verletzungen? Sie könnten Ihre eigene Art Notation mit Hilfe von Makros entwickeln, die nur in der normalen untypisierten Clojure Code kollabieren. Aber wenn man die statischen Typ Prüfung ausführen, würde es die Typen und Ausgabe Warnungen grok.

Wenn Sie eine etwas größere Herausforderung waren, könnten Sie sogar es ausführen müssen Typinferenz somit die Last der Notation zu senken.

Following diesem Thread gibt es nun ein Projekt zur bringen allmähliche Typisierung in Clojure (wie Dart, etc.). Worth testen es: typisierten-Clojure

Wenn jemand kann auch ein Feedback nach wirklichem Nutzen geben ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top