2009-10-02 12 views
12

Ho un lettore Lisp scritto in Java che sto pensando di tradurre in C. (O forse C++.) È un hack abbastanza completo e utile, quindi il problema principale è fare l'allocazione dello storage dinamico in una lingua senza spazzatura collezione. Se qualcuno lo ha già pensato, preferirei prendere in prestito il loro codice piuttosto che capirlo da solo. (C non è la mia lingua preferita.)Dove posso trovare un lettore Lisp in C?

Ovviamente, avere un lettore Lisp non ha senso se non hai intenzione di fare qualcosa con le cose che leggi, quindi forse avrei dovuto formulare la domanda, Dove trovo un semplice core Lisp scritto in C ?, ma nella mia esperienza la parte più difficile di scrivere un Lisp (in qualche modo sorprendentemente) è il lettore. Inoltre, non voglio avere un garbage collector; Sto anticipando un'applicazione in cui le strutture delle liste saranno liberate più o meno a mano.

risposta

1

ci sono un sacco di implementazioni Scheme incorporabile, al largo della parte superiore della mia testa: SIOD, Guile, ChickenScheme, Scheme48 ....

di
+1

So che potrei prendere del codice da fonti come quelle, ma sono un po 'troppo pesanti per quello che sto cercando. Gran parte del loro design è motivato da fattori globali (in particolare il GC) che non si applicano qui. Voglio qualcosa di abbastanza leggero --- strutture dati Lisp di base, qualcosa da leggere e convenzioni per liberarle. – airfoyle

+1

http://www.xlisp.org è piuttosto piccolo. – ephemient

4

Gary Knott Interpreting Lisp è molto bello. Puoi provare anche altri, come Jim Mayfield's Lisp. Ci sono probabilmente un sacco di piccole Lisps ...

Hai detto che non ti piace C. Forse ti piacerebbe Haskell - nel qual caso potresti provare "Write yourself a Scheme in 48 hours", un tutorial interessante (devi scrivere un interprete di Schema in Haskell).

Aggiornamento: So che un Lisper non si sentirebbe a proprio agio con Haskell, ma hey, è molto più comodo di C (almeno per me)! Oltre a questo, HAskell ha una buona FFI, quindi dovrebbe essere facile usare il Lisp-reader di Haskell come libreria compatibile con C.

Aggiornamento 2: Se si desidera utilizzare XLISP, come suggerito da un altro utente, si avrà probabilmente bisogno src/xlread.c (863 linee) e include/xlisp.h (1379 linee) - ma ho potuto errato ...

Aggiornamento 3: Se si utilizza il Lisp di Gary Knott (un singolo file C con 942 linee), la firma della funzione è int32 sread (void). Questo sarebbe il mio choie se non avessi bisogno di qualcosa di elaborato (come i macro di lettura) o altamente ottimizzato (c'è un documento PDF che descrive come il codice è implementato, quindi non dovrai trovare la tua strada in un labirinto). La documentazione per la funzione è:

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. 

Vedi che Lisp di Gary è vecchio e avrete bisogno di modificarlo in modo che compila. Invece di includere linuxenv.h, includono:

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

Inoltre, non funziona nelle macchine a 64 bit (la documentazione di SREAD dovrebbe dire perché ...)

Update 4: Non c'è anche il Scheme implementations da Nils Holm (ci sono libri che descrivono i meccanismi interni)

+2

Grazie; Guarderò la cosa di Knott. Su Haskell: Niente contro Haskell, ma se volessi farlo in un bellissimo ambiente funzionale, lo farei semplicemente in Lisp :) – airfoyle

2

lispreader è un semplice parser di file Lisp fatto in pianura C.

Se si desidera C++, si può scavare in giro in t he SuperTux source code, contiene un parser di file Lisp scritto in C++.

Quando si desidera un'implementazione reale di Lisp anziché solo un parser, è possibile dare un'occhiata a Abuse, che ne contiene uno piccolo come linguaggio di scripting dei giochi.

+1

Ora, perché questo mi fa pensare alla decima regola di Greenspun? :) – ephemient

2

MIT professor Rivest ha pubblicato una serie di piccoli lettori per s-espressioni nel 1997 http://people.csail.mit.edu/rivest/sexp.html come parte della sua DARPA ha sostenuto la ricerca sulla crittografia a chiave pubblica. Il codice legge e stampa solo ed è ben descritto in un documento scritto nello stile di una RFC su Internet.

Problemi correlati