Ist eine statisch typisierte vollständige Lisp-Variante möglich?
Ist eine statisch typisierte volle Lisp-Variante möglich? Macht es überhaupt Sinn für so etwas zu bestehen? Ich glaube, einer Lisp-Sprache der Tugenden ist die Einfachheit der definition. Würde die statische Typisierung Kompromiss das core-Prinzip?
InformationsquelleAutor der Frage Lambda the Penultimate | 2010-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist sehr möglich, obwohl ein standard-HM-Stil-Typ-system ist in der Regel die falsche Wahl für die meisten idiomatischen Lisp/Scheme-code. Sehen Eingegeben Schläger für eine neuere Sprache, die eine "Vollständige Lisp" (mehr wie Schema, eigentlich) mit der statischen Typisierung.
InformationsquelleAutor der Antwort Eli Barzilay
Wenn alles, was Sie wollte, war eine statisch typisierte Sprache, die sah aus wie Lisp, könnten Sie das tun, ziemlich leicht, durch die Definition einer abstrakten syntax-Baum für Ihre Sprache und dann Zuordnung, AST-S-Ausdrücke. Aber ich glaube nicht, dass ich nennen würde, das Ergebnis Lisp.
Wenn Sie etwas wollen, das wirklich Lisp-y-Merkmale neben der syntax, ist es möglich, dies zu tun, mit einer statisch typisierten Sprache. Es gibt jedoch viele Eigenschaften, Lisp, die sind schwer zu bekommen, viele nützliche statische Typisierung aus. Um dies zu verdeutlichen, werfen wir einen Blick auf die Struktur der Liste selbst, genannt die Nachteiledie Formen der primären Baustein von Lisp.
Aufruf der Nachteile einer Liste, obwohl
(1 2 3)
sieht aus wie einer, ist ein wenig irreführend. Zum Beispiel, es ist überhaupt nicht vergleichbar zu einer statisch typisierten Liste, wie C++'sstd::list
oder Haskell-Liste. Diese sind single-dimensional verknüpften Listen, in denen alle Zellen vom selben Typ sind. Lisp gerne können(1 "abc" #\d 'foo)
. Plus, selbst wenn Sie erweitern Ihre statisch-typisierte Listen-cover-Listen-of-Listen, die Art der Objekte erfordert, dass jeder element der Liste ist eine Teilliste. Wie würden Sie sich darstellen((1 2) 3 4)
?Lisp conses bilden eine Binär-Baum mit Blätter (Atome) und Zweige (conses). Weiter, die Blätter eines solchen Baumes enthalten kann jede Atomare (nicht-Nachteile) Lisp-Typ! Die Flexibilität dieser Struktur ist, was macht Lisp so gut im Umgang mit symbolischen Berechnung, ASTs und transformieren von Lisp-code selbst!
So, wie würden Sie das Modell, beispielsweise eine Struktur, die in einer statisch typisierten Sprache? Lassen Sie uns versuchen, es in Haskell, die eine extrem leistungsstarke und präzise statische Typsystem:
Ihre erste problem ist der Umfang des Atom-Typs. Klar, wir haben noch nicht nahm einen Atom-Typ von ausreichender Flexibilität, um alle Arten von Objekten wir wollen die Schlinge um in conses. Anstatt zu versuchen, die Verlängerung der Atom-Daten-Struktur, wie oben aufgeführt (die kann man deutlich sehen, spröde ist), sagen wir, wir hatten eine Magische Art Klasse
Atomic
dass sich all die Typen, die wir machen wollten, atomic. Dann könnten wir versuchen:Aber das wird nicht funktionieren, weil es erfordert, dass alle Atome in der Struktur von gleichen geben. Wir wollen, dass Sie in der Lage sein zu unterscheiden, von Blatt zu Blatt. Ein besserer Ansatz erfordert die Verwendung von Haskell ist existentiellen Quantoren:
Aber jetzt kommen Sie zum Kern der Sache. Was können Sie tun, mit die Atome in dieser Struktur? Welche Struktur haben Sie gemeinsam, die modelliert werden könnten mit
Atomic a
? Welche Ebene Art Sicherheit sind Sie garantiert mit so einem Typ? Hinweis: wir haben Sie nicht alle Funktionen unserer Art Klasse, und es gibt einen guten Grund: die Atome teilen nichts gemeinsam in Lisp. Ihre Supertypen in Lisp heißt einfacht
(D. H. oben).Um Sie zu nutzen, Sie hätte zu kommen mit Mechanismen zu dynamisch zwingen den Wert eines atoms zu etwas, was Sie eigentlich können. Und an diesem Punkt haben Sie im Grunde implementiert eine dynamisch typisierte subsystem innerhalb Ihrer statisch typisierten Sprache! (Kann man nicht helfen, aber beachten Sie eine mögliche Folge Greenspun ' s Tenth Rule of Programming.)
Beachten Sie, dass Haskell bietet Unterstützung nur für solche dynamische subsystem mit einem
Obj
Art, in Verbindung mit einemDynamic
Art und Typeable Klasse zu ersetzen unsereAtomic
Klasse, die es erlauben, beliebige Werte gespeichert werden, mit deren Typen und expliziter Zwang, der wieder aus diesen Typen. Das ist die Art von system, das Sie brauchen, um für die Arbeit mit Lisp-cons-Strukturen in Ihrer vollen Allgemeinheit.Was man auch tun kann ist den anderen Weg gehen, und einbetten einer statisch typisierten subsystem innerhalb einer im wesentlichen dynamisch typisierte Sprache. Dies ermöglicht es Ihnen den Vorteil der statische Typ-Prüfung für die Teile des Programms können die Vorteile der strengere Typ-Anforderungen. Dies scheint der Ansatz, der in CMUCL die eingeschränkte form des genaue Typ-überprüfungzum Beispiel.
Schließlich gibt es noch die Möglichkeit, zwei separate Teilsysteme, dynamisch und statisch typisiert, dass Sie contract-Stil der Programmierung zu helfen navigieren den übergang zwischen den beiden. So kann die Sprache aufnehmen Verwendungen von Lisp, wo statische Typ-überprüfung wäre mehr ein Hindernis als eine Hilfe, sowie Anwendungen, bei denen statische Typ-Prüfung wäre von Vorteil. Dies ist der Ansatz von Eingegeben Schlägerwie Sie sehen werden, aus den Kommentaren, die Folgen.
InformationsquelleAutor der Antwort Owen S.
Meine Antwort, ohne ein hohes Maß an Vertrauen ist wahrscheinlich. Wenn man sich auf eine Sprache wie SML, zum Beispiel, und vergleichen Sie es mit Lisp, der funktionale Kern eines jeden ist fast identisch. Als Ergebnis, es scheint nicht, wie Sie würde haben viel Mühe in der Anwendung einer Art von statischer Typisierung zu den Kern-Lisp (Funktion, Anwendung und primitive Werte).
Ihre Frage sagt voll obwohl, und wo ich sehen einige das problem kommt in ist der code-as-data-Ansatz. Typen existieren in einer mehr abstrakten Ebene als Ausdrücke. Lisp nicht diese Unterscheidung ist alles "flat" in der Struktur. Wenn wir betrachten einen Ausdruck E :: T (wo T ist eine Abbildung von Ihrer Art), und dann betrachten wir diesen Ausdruck als plain ol' Daten, dann was ist genau der Typ von T hier? Gut, es ist eine Art! Eine Art ist eine höhere Ordnung geben, also lasst uns einfach weitermachen und sagen etwas über die, die in unserem code:
Könnten Sie sehen, wo ich mit diesem gehe. Ich bin mir sicher, dass durch die Trennung die Typ-Informationen aus dem code wäre es möglich, zu vermeiden, diese Art von selbst-referentialität von Arten, jedoch würde die Typen nicht sehr "lisp" in Ihren Geschmack. Es gibt wahrscheinlich viele Möglichkeiten, um dieses, obwohl es mir nicht klar, welches das beste wäre.
EDIT: ach so, mit ein bisschen googlen fand ich Qiwas zu sein scheint sehr ähnlich zu Lisp abgesehen davon, dass Sie statisch typisiert. Vielleicht ist es ein guter Ort, um zu starten, um zu sehen, wo Sie änderungen vorgenommen, um die statische Typisierung.
InformationsquelleAutor der Antwort Gian
Dylan: http://visualization.dylan-user.org/diploma.pdf
InformationsquelleAutor der Antwort Rainer Joswig