Frage

Ich weiß, dass dies wie Gotteslästerung zu Lisp-Fans klingen mag (und andere Liebhaber von dynamischen Sprachen), aber, wie schwierig es wäre die Clojure-Compiler-Unterstützung statisch (Compile-Zeit) Typprüfung zu verbessern sein?

Abgesehen die Argumente für und gegen statische und dynamische Typisierung ist dies möglich (nicht „ist dies ratsam“)?

Ich dachte, dass ein neues Leser Makro Hinzufügen einer Kompilierung-Typ zu erzwingen (eine erweiterte Version des # ^ Makro) und das Hinzufügen der Typinformationen zu der Symboltabelle würde der Compiler-Flag Stellen erlauben, wo ein Variablen missbraucht wurde . Zum Beispiel in dem folgenden Code, würde ich einen Fehler bei der Kompilierung erwarten (# * ist der "Compile-Zeit" Typ Makro):

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

Die # ^ Makro auch mit einer globalen Variablen (*compile-time-type-checking*) wiederverwendet werden, um die Compiler die die Kontrollen zu tun zu erzwingen.

Alle Gedanken über die Machbarkeit?

War es hilfreich?

Lösung

Es ist sicherlich möglich. Der Compiler bereits hat einigen statischen Typen um primitive Argument-Typen in dem 1.3 Entwicklungszweig zu überprüfen.

Andere Tipps

Es ist sicher möglich. Allerdings glaube ich nicht, dass Clojure jemals irgendeine Form von schwacher statischer Typisierung erhalten -. Es der Vorteile von zu wenig

Reiche Hickey hat jedoch mehrfach zum Ausdruck gebracht sein wie für das starke, optional und ausdruck Typisierung Merkmal der Qi Sprache, http://www.lambdassociates.org/qilisp.htm

alt text

Ja! Es sieht aus wie ein Projekt im Gang ist, core.typed, optionalen statischen Typen macht eine Realität zu überprüfen. Sehen Sie sich die Github-Projekt und seine Dokumentation

Diese Arbeit wuchs aus einem Bachelor Honours Dissertation (PDF) von Ambrose Bonnaire-Sergeant, und bezieht sich auf die typisierten Racket System.

Da eine Form und zu einem Zeitpunkt ausgewertet gelesen wird, kann man nicht hat Vorwärtsreferenzen diese etwas eingeschränkt zu machen.

Alte Frage, aber zwei wichtige Punkte: Ich glaube nicht unterstützt Leser Makros Clojure, nur gewöhnliches Lisp-Makros. Und jetzt haben wir core.typed Option für in Clojure eingeben.

declare kann Typ Hinweise haben, so ist es möglich, eine var zu erklären, dass „ist“ die Art, die bisher noch nicht definiert wurde, enthält jedoch Daten über die Struktur, aber das wäre wirklich klobig und Sie würden es müssen vor tun jeder Codepfad, dass könnte ausgeführt werden, bevor der Typ definiert ist. Grundsätzlich würden Sie alle Ihre benutzerdefinierte Typen vorne definieren und sie dann wie normale verwenden. Ich denke, das macht die Bibliothek schriftlich etwas hackish.

Das wollte ich nicht früher darauf, dass dies nicht möglich ist, dass nur für benutzerdefinierte Typen es viel mehr ist komplizierter als für vordefinierte Typen. Der Nutzen eines solchen Vorgehens gegen die Kosten ist etwas, das ernsthaft in Betracht gezogen werden sollte. Aber ich ermutige jeden, der daran interessiert ist, es zu versuchen und sehen, ob sie machen es funktionieren kann!

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