2009-10-02 17 views
12

Mam czytnik Lisp napisany w Javie, który mam zamiar przetłumaczyć na C. (A może C++). Jest to dość kompletny i przydatny hack, więc głównym problemem jest przydzielanie dynamicznego zapisu w języku bez śmieci kolekcja. Jeśli ktoś już to przemyślał, raczej pożyczyłbym swój kod, niż sam to wymyśliłem. (C nie jest moim ulubionym językiem).Gdzie mogę znaleźć czytnik Lisp w C?

Oczywiście, posiadanie czytnika Lisp nie ma sensu, chyba że planujesz zrobić coś z tym, co czytasz, więc może powinienem sformułować pytanie: Gdzie znajdę prosty rdzeń Lispa napisany w C ?, ale moim zdaniem najtrudniejszą nieuniknioną częścią napisania Lispa (nieco zaskakująco) jest czytelnik. Poza tym nie chcę mieć śmieciarza; Spodziewam się aplikacji, w której struktury list zostaną uwolnione mniej więcej ręcznie.

Odpowiedz

1

istnieje wiele niezabudowany implementacji programu, od szczytu głowy: SIOD, Guile, ChickenScheme, Scheme48 ....

+1

Wiem, że mogę pobrać kod ze źródeł takich jak te, ale są one zbyt ciężkie dla tego, czego szukam. Wiele ich projektów jest motywowanych czynnikami globalnymi (szczególnie GC), które nie mają tu zastosowania. Chcę czegoś dość lekkiego - podstawowych struktur danych Lispa, czegoś, co można by je odczytać, i konwencji dotyczących ich uwalniania. – airfoyle

+1

http://www.xlisp.org jest również bardzo mały. – ephemient

4

Gary Knott Interpreting Lisp jest bardzo miłe. Możesz także wypróbować inne, takie jak Jim Mayfield's Lisp. Prawdopodobnie jest tam wiele małych Lispsów ...

Wspomniałeś, że nie lubisz C. Może chcesz Haskella - w takim przypadku możesz wypróbować "Write yourself a Scheme in 48 hours", interesujący samouczek (możesz napisać tłumacz Scheme w Haskell).

Aktualizacja: wiem, że Lisper raczej nie czuć się komfortowo używając Haskell, ale hej, to jest o wiele bardziej komfortowe niż C (przynajmniej dla mnie)! Poza tym HAskell ma dobry FFI, więc powinno być łatwe korzystanie z czytnika Lisp-a stworzonego przez Haskella jako biblioteki kompatybilnej z C.

Aktualizacja 2: Jeśli chcesz użyć XLisp, sugerowane przez innego użytkownika, będzie prawdopodobnie trzeba src/xlread.c (863 linii) i include/xlisp.h (1379 linii) - ale mogłem być źle ...

Update 3: Jeśli używasz Gary Knott za Lisp (jeden plik C z 942 linii), podpis funkcja jest Int32 sread (void). To byłby mój wybór, gdybym nie potrzebował niczego wymyślnego (np. Odczytanych makr) lub wysoce zoptymalizowanego (jest papier PDF, który opisuje, w jaki sposób kod jest zaimplementowany, więc nie będziesz musiał szukać drogi w labiryncie). Dokumentacja dla funkcji jest:

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. 

Zobacz, że Gary's Lisp jest stary i będziesz musiał go zmienić, aby kompilował. Zamiast tym linuxenv.h, obejmują:

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

Także, to nie działa w komputerach 64-bitowych (dokumentacja sread powinien powiedzieć dlaczego ...)

Update 4: Jest również Scheme implementations Nils Holm (są tam książki opisujące wewnętrzne)

+2

Dzięki; Zajrzę do sprawy Knotta. Na Haskell: Nic przeciwko Haskellowi, ale gdybym chciał zrobić to w pięknym środowisku funkcjonalnym, zrobiłbym to po prostu w Lisp :) – airfoyle

2

lispreader jest prostym Lisp plik parser zrobić w zwykłym C

Jeśli chcesz C++ można grzebać w t on SuperTux source code, zawiera parser plików Lisp napisany w C++.

Jeśli chcesz mieć rzeczywistą implementację Lispa zamiast tylko parsera, możesz rzucić okiem na Abuse, który zawiera mały jako język skryptowy gier.

+1

Dlaczego to przypomina mi Dziesiąta Reguła Greenspuna? :) – ephemient

2

MIT profesor Rivest opublikował zbiór małych czytelników S-wyrażeń w 1997 http://people.csail.mit.edu/rivest/sexp.html jako część jego DARPA obsługiwane badania na kryptografii klucza publicznego. Kod tylko czyta i drukuje i jest dobrze opisany w dokumencie napisanym w stylu internetowego RFC.

Powiązane problemy