Grundlegende Prädikate / F-Funktionen
McCarthy ‚s Grund S-Funktionen und Prädikate waren:
atom
Was notwendig war, weil Auto und CDR nur für Listen definiert sind, was bedeutet, dass Sie sich auf keine Antwort verlassen können, um anzuzeigen, was passiert ist, wenn Sie car
ein Atom gegeben haben.
eq
Zum Testen der Gleichheit zwischen Atomen.
car
Zur Rückgabe der ersten Hälfte (Adresse) der Cons-Zelle. (Inhalt des Adressregisters).
cdr
Zur Rückgabe der zweiten Hälfte (Dekrement) der Cons-Zelle. (Inhalt des Dekrementregisters).
cons
Zum Erstellen einer neuen Nachteile-Zelle, wobei die Adresshälfte das erste Argument für Nachteile und die Dekrementhälfte das zweite Argument enthält.
Zusammenbinden: S-Funktionen
Anschließend fügte er seiner Grundnotation hinzu, um das Schreiben von sogenannten S-Funktionen zu ermöglichen:
quote
Einen Ausdruck darstellen, ohne ihn auszuwerten.
cond
Die Grundbedingung für die zuvor beschriebenen Prädikate.
lambda
Eine Funktion bezeichnen.
label
Obwohl er dies nicht für die Rekursion benötigte, wusste er möglicherweise nichts über den Y-Kombinator ( laut Paul Graham ), fügte dies jedoch zur Vereinfachung und zur Ermöglichung einer einfachen Rekursion hinzu.
Sie sehen also, dass er tatsächlich 9 grundlegende "Operatoren" für seine Lisp-Maschine definiert hat. In einer früheren Antwort auf eine andere Ihrer Fragen habe ich erklärt, wie Sie mit diesem System Zahlen darstellen und bearbeiten können.
Die Antwort auf diese Frage hängt jedoch davon ab, was Sie von Ihrer Lisp-Maschine erwarten. Sie könnten eine ohne die label
Funktion implementieren , da Sie einfach alles funktional zusammensetzen und durch Anwenden des Y-Kombinators eine Rekursion erhalten könnten.
atom
könnte verworfen werden, wenn Sie die car
Operation für zurückkehrende Atome definiert haben NIL
.
Sie könnten im Wesentlichen McCarthys LISP-Maschine mit 7 dieser 9 definierten Grundelemente haben, aber Sie könnten angeblich eine präzisere Version definieren, je nachdem, wie viel Unannehmlichkeit Sie sich selbst zufügen möchten. Ich mag seine Maschine ganz gut oder die vielen Grundelemente in den neueren Sprachen wie Clojure.
Der beste Weg, dies tatsächlich sicher zu wissen, ist, wenn Sie es implementieren. Ich habe 3 Sommer verwendet, um Zozotez zu erstellen , ein McCarty-ish LISP, das auf Brainfuck läuft .
Ich habe versucht herauszufinden, was ich brauchte und in einem Forum finden Sie einen Thread, der besagt, dass Sie nur Lambda brauchen. Auf diese Weise können Sie einen ganzen LISP in Lambda-Kalkül erstellen, den Sie möchten. Ich fand es interessant, aber es ist kaum der richtige Weg, wenn Sie etwas wollen, das irgendwann Nebenwirkungen hat und in der realen Welt funktioniert.
Für ein vollständiges Turing-LISP habe ich Paul Grahams Erklärung von McCarthys Artikel verwendet und alles, was Sie wirklich brauchen, ist:
Das ist 10. Darüber hinaus, um eine Implementierung zu haben, die Sie testen können und nicht nur auf einem Zeichenbrett:
Das ist 12. In meinem Zozotez habe ich auch Set und Flambda (anonyme Makros wie Lambda) implementiert. Ich könnte ihm eine Bibliothek zuführen, die jedes dynamisch gebundene Lisp (Elisp, picoLisp) mit Ausnahme der Datei-E / A implementiert (da die zugrunde liegende BF es nur stdin / stdout unterstützt).
Ich empfehle jedem, einen LISP1-Interpreter sowohl in LISP als auch (nicht in LISP) zu implementieren, um vollständig zu verstehen, wie eine Sprache implementiert wird. LISP hat eine sehr einfache Syntax und ist daher ein guter Ausgangspunkt für einen Parser. Ich arbeite derzeit an einem Schema-Compiler, der in Schema mit verschiedenen Zielen geschrieben ist (wie Stalin für Ziel C), hoffentlich BF als eines davon.
quelle
McCarthy verwendet sieben Betreiber die ursprüngliche Lisp zu definieren:
quote
,atom
,eq
,car
,cdr
,cons
undcond
. Dieser Artikel zeichnet seine Schritte nach.quelle
label
es tatsächlich auch , obwohl es nicht nötig war.lambda
auch.lambda
undlabel
in Bezug auf die sieben gegebenen Primitive. Er stellt nur vor, was er damit meint, bevor er ihre Implementierung in der Definition voneval
in Abschnitt 4 angibt. Sie können sehen, dass die Implementierung voneval
Unterstützung fürlambda
/list
ohne sich selbst bietet, abhängig von beiden.Diese FAQ besagt:
Das kommt von der Carnegie Melon-Website der School of Computer Science.
quelle
Paul Graham implementiert eval mit sieben .
In McCarthys Micro Manual for LISP implementiert er eval mit zehn .
quelle
Sie benötigen lediglich eine x86-
MOV
Anweisung .Im Ernst, diese Grundelemente implementieren keine Lisp-Maschine. Eine Maschine benötigt Einrichtungen wie E / A und Speicherbereinigung. Ganz zu schweigen von einem Funktionsaufrufmechanismus! Okay, Sie haben sieben Grundelemente, die Funktionen sind. Wie ruft die Maschine eine Funktion auf?
Das richtige Verständnis von dem, was diese Grundelemente ermöglichen, dass sie aussetzen den Befehlssatz eines Universal - Turing - Maschine . Da diese Anweisungen "Lispy" sind, nennen wir dies durch einen Versprecher (der mit einem Lisp spricht) schleichend eine "Lisp-Maschine". "Universal" bedeutet, dass die Maschine programmierbar ist: Mit einigen Kombinationsanweisungen, die auf die Universal Turing Machine angewendet werden, können wir jede Turing Machine instanziieren. Bisher ist das alles ein rein mathematisches Konstrukt.
Um diese UTM tatsächlich zu simulieren - realisieren Sie sie physisch, um sie auf einem Computer zu erkunden -, benötigen wir eine Maschine, mit der wir tatsächlich die Formulare eingeben können, mit denen Turing-Maschinen aus Kombinationen dieser sieben Lisp-Anweisungen erstellt werden. Und wir brauchen auch irgendeine Form von Ausgabe; die Maschine, um uns zumindest "Ja", "Nein" oder "Warten Sie, ich laufe noch" zu sagen.
Mit anderen Worten, die einzige Möglichkeit, wie diese sieben Anweisungen praktisch funktionieren können, besteht darin, dass sie auf einem größeren Computer gehostet werden, der die Umgebung bereitstellt.
Beachten Sie auch, dass Grahams sieben Grundelemente keine explizite Unterstützung für Zahlen haben, sodass Sie sie aus Funktionen erstellen müssten ("Church Numbers" -Technik). Keine Produktions-Lisp-Implementierung macht so eine verrückte Sache.
quelle