C Lisp-Interpreter

asdfman

Commander
Registriert
März 2008
Beiträge
2.315
Vielleicht erinnert sich der Ein- oder Andere an meinen gescheiterten Versuch, einen
Interpreter für mathematische Ausdrücke zu schreiben. Diesen Versuch habe ich zwar
zu den Akten gelegt, aber das Thema an sich ließ mich nicht los. Deshalb habe ich
angefangen, in Anlehnung an den Interpreter, der in SICP abgedruckt ist, einen eigenen
Lisp-Interpreter zu schreiben:

https://github.com/SirDzstic/libisp

Der Garbage Collector ist noch nicht eingebaut, dafür hat der Rest vermutlich viele viele
Bugs. Hat jemand Lust, sich das einmal anzusehen und Rückmeldungen zu geben?

Das Beispielprogramm interpretiert die Fakultätsfunktion:

Code:
(define (f n) (if (= n 1) 1 (* n (f (- n 1)))))

und ruft sie dann mit (f 5) auf. Das funktioniert zumindest fehlerfrei.

Schöne Grüße,
asdfman
Ergänzung ()

Schade, dass das offensichtlich niemanden interessiert :/

Ich habe einige Bugs gefixt und der Garbage Collector funktioniert jetzt auch.

€: So, jetzt hat der Testinterpreter einen REPL. Wenn jetzt immer noch keiner Bock hat, sich ihn
anzusehen, kann ich auch nichts mehr machen. Dieses Desinteresse finde ich wirklich schade.

libisp_repl.png
 
Zuletzt bearbeitet:
Es ist wohl kein Desinteresse, sondern die schlichte Tatsache, dass du eine sehr exotische Programmiersprache verwendest. Wer kann im Zeitalter von Java, C++ oder C# noch LISP? Ich weiß, diese Sprache ist sehr mächtig aber eben auch eigenwillig. Da du allerdings in der Lage bist, einen eigenen Interpreter dafür zu schreiben, kann man wohl annehmen, dass du der führende Experte für LISP im gesamten Computerbase-Forum bist. ;-)

Ist schon beeindruckend, muss ich ja mal so sagen.
 
Jepp, LISP ist schon exotisch. Hatte früher mal mit SCHEME zu tun das ja ähnlich ist. An sich schon schöne Sprachen, vor allem zum lernen und Testen von Algorithmen. Aber heutzutage in der Praxis nicht mehr anzutreffen...

So ein Interpreter ist schon beeindruckend. Mit der Postfix-Notation aber im Vergleich zu einem für mathematische Ausdrücke mit der üblichen Infix-Notation vermutlich einfacher zu realisieren, oder?
 
Lisp ist ja eher eine Familie von Dialekten, als eine Sprache für sich. Der Interpreter ist für den Dialekt Scheme, also müsste er dir vertraut vorkommen. Zur Zeit sind noch nicht alle Primitives implementiert (also es gibt zum Beispiel kein cons, car und cdr) aber ein minimum ist da, das es erlaubt, zumindest ein wenig herumzuspielen. Scheme ist sehr minimalistisch, deshalb bin ich kaum ein Experte, nur weil ich den Interpreter geschrieben habe. Ich kenne die Grundlagen, die man kennen muss. Die Implikationen dieser Grundlagen, die Scheme trotz seines geringen Umfanges so mächtig machen, verstehe ich auch nur bis zu einem gewissen Grad. Der Interpreter ist für mich also auch ein Werkzeug, mirch in dieser Beziehung weiterzubilden.

TL;DR: Bin alles andere, als LISP-Experte. Nur ein vielleicht fortgeschrittener C-Anfänger.

€: Was die Applikation von Operatoren angeht, ist die Notation jetzt nicht so wichtig. Der Interpreter abstrahiert das weitgehend weg. Es gibt eine Funktion, die überprüft, ob der Ausdruck eine Applikation eines Operators ist und man könnte das leicht in Infixnotation ändern, indem man nur diese Funktion und diejenigen, die den Operator und die Operanden aus dem Ausdruck extrahieren, anpasst.
 
Zuletzt bearbeitet:
So, alle Bugs die ich finden konnte sind gefixt. Habe das als Version 0.1 getagt und werde dann hier nicht weiter darüber reden :<
 
Habs mal ausgetestet. Scheint soweit ganz gut zu funktionieren, aber insbesondere die Fehlermeldungen sind nicht wirklich hilfreich. Man gebe z.B. einmal "(map)" ein; da wäre es praktisch, wenn er anzeigt welche und wieviele Parameter denn fehlen.

Auch bei lambda stimmt irgendwas noch nicht so ganz. Der folgende Ausdruck
Code:
((lambda x (+ x 3)) 5)
liefert einen Fehler. Erst wenn ich das erste "x" einklammere, funktionert es.

Dann wäre es vlt auch ganz schön, wenn man einen Fehler bekäme, wenn eine Funktion mit einem Wert des falschen Typs aufgerufen wird. Also "(+ 4 5 'a)" liefert momentan nur ().
 
Hatte das mit dem Lambda ohne Klammer vorhin hier ausprobiert: http://tryscheme.sourceforge.net/
Aber ich glaube, ich hatte da was falsch gemacht, denn als ich es eben nochmal probierte, ging es garnicht. Also ist dieser Punkt wohl doch korrekt implementiert von dir.
 
Zurück
Oben