Frage

Ich möchte fragen, welche Art von Typ -Sicherheitssprachen Konstrukte auf Clojure sind?

Ich habe jetzt mehrmals "Practical Clojure" von Luke Vanderhart und Stuart Sierra gelesen, aber ich habe immer noch den ausgeprägten Eindruck, dass Clojure (wie andere LISPs) die Überprüfung der Zusammenstellung der Kompilierung nicht sehr ernst nimmt. Type Sicherheit ist nur eine (sehr beliebte) Strategie für die Überprüfung der korrekten Semantik für die Zusammenstellung

Ich stelle diese Frage, weil ich schmerze, mich als falsch erwiesen zu haben. Welche Art von Entwurfsmustern gibt es auf Clojure, um zu validieren (zum Zeitpunkt der Zusammenstellung, nicht zur Laufzeit), dass eine Funktion, die erwartet, nicht mit einer Liste von Ganzzahlen aufgerufen wird?

Außerdem habe ich sehr kluge Leute wie Paul Graham gelesen, die sich offen für Lisp einsetzt, um alles von Sprachen auf niedrigerer Ebene zu implementieren (die meisten sagen, dass die Sprache selbst darüber implementiert wird). Wäre wahr, dann sollte trivial Dinge wie Typ -Checking ein Kinderspiel sein. Haben Sie also das Gefühl, dass es Typsysteme (oder die Möglichkeit gibt, solche Typsysteme implementieren) in Clojure oder anderen LISPs, die dem Programmierer die Möglichkeit geben, die Überprüfung der Validierung von der Laufzeit bis zur Kompilierung der Zeit oder sogar besser zu design- ausgleichen. Zeit?

War es hilfreich?

Lösung

Kompilierungseinheiten in Clojure sind sehr klein - eine einzige Funktion. Lispers ändert sich während der Entwicklung kleiner Teile von Laufprogrammen. Die Einführung statischer Typen in diesen Entwicklungsstil ist problematisch - für eine tiefere Diskussion, warum ich den Beitrag empfehle Typen sind von Gilad Bracha antimodular. So bevorzugen Clojure Pre/Post-Konditionen, die mit der hochrangigorientierten Entwicklung von LiSP besser eingestuft werden.

Das heißt, es ist sicherlich wünschenswert und möglich, ein A -la -Carte -Typ -System für Clojure zu bauen. Dieser Weg wurde von Qi/Shen und einem tippten Schläger ausgebreitet. Diese Funktionalität kann leicht als Bibliothek bereitgestellt werden. Ich hoffe, dass ich in Zukunft so etwas mit Core.logic - aufbauen kann - https://github.com/clojure/core.logic.

Andere Tipps

Da Clojure eine dynamische Sprache ist, ist die ganze Idee nicht, die Typen (oder viel von irgendetwas) zur Kompilierungszeit zu überprüfen.

Auch wenn Sie Typen zu Ihrer Funktion hinzufügen, werden Sie bei der Kompilierungszeit nicht überprüft.

Da Clojure ein Lisp ist, können Sie bei Compile-Time mit Makros und Makros leistungsstark genug tun, um Ihre eigenen Typsysteme zu schreiben. Einige Leute haben Typsysteme für LISPs erstellt Typed Schläger und Qi. Diese Typsysteme können genauso leistungsfähig sein wie jedes Typsystem in einer "normalen" Sprache.

Ok, wir wissen jetzt, dass es möglich ist, aber hat Clojure ein so optionales Typsystem? Die Antwort lautet derzeit nicht, aber es gibt eine Logik -Engine (Core.logic), mit der ein Typensystem implementiert werden kann, der Autor jedoch (noch) in dieser Richtung nicht gearbeitet hat.

Es gibt eine Bibliothek, die ein optionales Typsystem zum Clojure hinzufügt.

http://typedclojure.org/

Begründung

Das statische Typing hat bekannte Vorteile. Beispielsweise fangen statisch getippte Sprachen zum frühestmöglichen Zeitpunkt viele gängige Programmierfehler auf: Kompilierung der Zeit. Die Typen dienen auch als hervorragende Form der (maschinell überprüfbaren) Dokumentation, die die vorhandene handgeschriebene Dokumentation fast immer erhöhen.

Sprachen ohne statische Typüberprüfung (dynamisch getippt) bringen andere Vorteile. Ohne die strikte Starrheit der obligatorischen statischen Typisierung können sie flexiblere und verzeihendere Redewendungen liefern, die beim schnellen Prototyping helfen können. Oft werden die Vorteile der statischen Typprüfung im Wachstum des Programms erwünscht.

Diese Arbeit fügt Clojure eine statische Überprüfung (und einige seiner Vorteile) hinzu, eine dynamisch typisierte Sprache, während dennoch Redewendungen erhalten, die die Sprache charakterisieren. Es ermöglicht es, statischer und dynamisch eingebildeter Code zu mischen, damit der Programmierer das verwenden kann, was auch immer angemessener ist.

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