2009-10-02 3 views
12

Ich habe einen Lisp-Reader in Java geschrieben, den ich in C übersetzen möchte. (Oder vielleicht C++.) Es ist ein ziemlich vollständiger und nützlicher Hack, also ist das Hauptproblem die dynamische Speicherzuweisung in einer Sprache ohne Müll Sammlung. Wenn jemand das bereits durchdacht hat, würde ich mir lieber seinen Code ausleihen, als es mir selbst auszudenken. (C ist nicht meine Lieblingssprache.)Wo finde ich einen Lisp-Leser in C?

Natürlich macht es keinen Sinn, einen Lisp-Leser zu haben, es sei denn, Sie planen etwas mit den Dingen, die Sie lesen, also hätte ich vielleicht die Frage "Wo finde ich?" ein einfacher Lisp-Kern in C geschrieben, aber nach meiner Erfahrung ist der schwerste unvermeidbare Teil des Schreibens eines Lisp (etwas überraschend) der Leser. Außerdem möchte ich keinen Müllsammler haben; Ich erwarte eine Anwendung, bei der die Listenstrukturen mehr oder weniger von Hand freigegeben werden.

Antwort

1

gibt es viele embeddable Scheme-Implementierungen, aus der Spitze von meinem Kopf: SIOD, Guile, ChickenScheme, Scheme48 ....

+1

Ich weiß, dass ich Code aus Quellen wie diesen bekommen könnte, aber sie sind ein bisschen zu schwer für das, wonach ich suche. Viele ihrer Designs sind von globalen Faktoren (insbesondere dem GC) motiviert, die hier nicht zur Anwendung kommen. Ich möchte etwas ziemlich Leichtes --- grundlegende Lisp-Datenstrukturen, etwas, um sie zu lesen, und Konventionen, um sie zu befreien. – airfoyle

+1

http://www.xlisp.org ist auch ziemlich klein. – ephemient

4

Gary Knott Interpreting Lisp das ist sehr schön. Sie können auch andere versuchen, wie Jim Mayfield's Lisp. Es gibt wahrscheinlich viele kleine Lisps da draußen ...

Sie erwähnten, dass Sie nicht C. mögen. Vielleicht möchten Sie Haskell - in diesem Fall könnten Sie versuchen "Write yourself a Scheme in 48 hours", ein interessantes Tutorial (Sie schreiben zu schreiben ein Scheme-Interpreter in Haskell).

Update: Ich weiß, dass ein Lisper würde sich kaum wohl fühlen mit Haskell, aber hey, es ist viel komfortabler als C (zumindest für mich)! Außerdem hat HAskell ein gutes FFI, daher sollte es einfach sein, den Haskell-gemachten Lisp-Leser als C-kompatible Bibliothek zu verwenden.

Update 2: Wenn Sie XLISP verwenden, wie von einem anderen Benutzer vorgeschlagen, werden Sie wahrscheinlich src/xlread.c (863 Zeilen) und include/xlisp.h (1379 Zeilen) müssen - aber ich kann falsch sein ...

Update 3: Wenn Sie Gary Knott's Lisp (eine einzelne C-Datei mit 942 Zeilen) verwenden, ist die Funktionssignatur int32 sread (void). Das wäre meine Wahl, wenn ich nichts Besonderes (wie gelesene Makros) oder hoch optimierte (es gibt ein PDF-Dokument, das beschreibt, wie der Code implementiert ist, so dass Sie sich nicht in einem Labyrinth finden müssen). Die Dokumentation für die Funktion ist:

This procedure scans an input string g using a lexical token scanning 
routine, e(), where e() returns 
        1 if the token is '(' 
        2 if the token is ''' 
        3 if the token is '.' 
        4 if the token is ')' or a typed pointer d to an 
atom or number stored in row ptrv(d) in the atom or number tables. 
Due to the typecode (8 or 9) of d, d is a negative 32-bit integer. The 
token found by e() is stripped from the front of g. 

SREAD constructs an S-expression and returns a typed pointer to it as 
its result. 

Sehen Sie, dass Garys Lisp alt ist und Sie werden es ändern müssen, damit es kompiliert wird. Statt einschließlich linuxenv.h, umfassen:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 
#include <setjmp.h> 

Auch ist es nicht in 64-Bit-Maschinen funktioniert (die Dokumentation von Sread sollte Ihnen sagen, warum ...)

Update 4: Es gibt auch die Scheme implementations von Nils Holm (es gibt Bücher, die Interna der Beschreibung)

+2

Danke; Ich werde in die Knott-Sache schauen. Auf Haskell: Nichts gegen Haskell, aber wenn ich es in einer schönen funktionalen Umgebung tun wollte, würde ich es einfach in Lisp machen :) – airfoyle

2

lispreader ist eine einfache Lisp-Datei-Parser in Klar C. getan

Wenn Sie C++ möchten, können Sie in t wühlen Er enthält SuperTux source code, einen Lisp-Dateiparser, der in C++ geschrieben ist.

Wenn Sie eine tatsächliche Implementierung von Lisp anstelle von nur einem Parser möchten, können Sie sich Abuse ansehen, die ein kleines als die Skriptsprache des Spiels enthält.

+1

Nun, warum erinnert mich das an Greenspuns Zehnte Regel? :) – ephemient

2

MIT veröffentlichten Professor Rivest eine Reihe von kleinen Lesern für s-Ausdrücke im Jahr 1997 http://people.csail.mit.edu/rivest/sexp.html als Teil seiner DARPA geförderte Forschung auf Public-Key-Kryptographie. Der Code liest und druckt nur und ist in einem Dokument im Stil eines Internet-RFC gut beschrieben.