2009-10-02 11 views
12

Tengo un lector de Lisp escrito en Java que estoy pensando en traducir a C. (O tal vez C++). Es un hack bastante completo y útil, por lo que el problema principal es realizar la asignación de almacenamiento dinámico en un lenguaje sin basura colección. Si alguien ya lo ha pensado, preferiría tomar prestado su código antes que resolverlo por mi cuenta. (C no es mi idioma favorito)¿Dónde puedo encontrar un lector de Lisp en C?

Por supuesto, tener un lector de Lisp no tiene sentido a menos que planee hacer algo con las cosas que lee, así que quizás debería haber formulado la pregunta: ¿Dónde encuentro? un simple núcleo Lisp escrito en C ?, pero en mi experiencia la parte más difícil e inevitable de escribir un Lisp (algo sorprendente) es el lector. Además, no quiero tener un recolector de basura; Estoy anticipando una aplicación donde las estructuras de la lista se liberarán más o menos a mano.

Respuesta

1

hay un montón de implementaciones Esquema integrables, frente a la parte superior de mi cabeza: SIOD, Guile, ChickenScheme, Scheme48 ....

de
+1

Sé que podría tomar algún código de fuentes como esas, pero son un poco demasiado pesadas para lo que estoy buscando. Gran parte de su diseño está motivado por factores globales (especialmente el GC) que no se aplican aquí. Quiero algo bastante liviano: estructuras de datos Lisp básicas, algo para leerlas y convenciones para liberarlas. – airfoyle

+1

http://www.xlisp.org es bastante pequeño también. – ephemient

4

Gary Knott Interpreting Lisp es muy agradable. También puedes probar con otros, como Jim Mayfield's Lisp. Probablemente hay muchos pequeños Lisp por ahí ...

Mencionaste que no te gusta C. Tal vez te gustaría Haskell, en cuyo caso podrías probar "Write yourself a Scheme in 48 hours", un interesante tutorial (puedes escribir un intérprete de Scheme en Haskell).

Actualización: Sé que un Lisper difícilmente se sentiría cómodo con Haskell, pero bueno, es mucho más cómodo que C (al menos para mí). Además de eso, HAskell tiene una buena FFI, por lo que debería ser fácil usar el lector Lisp hecho por Haskell como una biblioteca compatible con C.

Actualización 2: Si desea utilizar XLISP, como se sugiere por otro usuario, es probable que necesite src/xlread.c (863 líneas) e incluyen/xlisp.h (1379 líneas) - pero pude estar equivocado ...

Actualización 3: Si usa Gary Knott's Lisp (un solo archivo C con 942 líneas), la firma de la función es int32 sread (void). Esta sería mi elección si no necesitara nada sofisticado (como leer macros) o altamente optimizado (hay un documento PDF que describe cómo se implementa el código, por lo que no tendrá que encontrar el camino en un laberinto). La documentación de la función es:

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. 

Ver que Lisp de Gary es viejo y que necesita para cambiarlo por lo que compila. En lugar de incluir linuxenv.h, incluyen:

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

Además, no funciona en equipos de 64 bits (la documentación de SREAD debe decirle por qué ...)

Update 4: Hay también el Scheme implementations de Nils Holm (hay libros que describen el funcionamiento interno)

+2

Gracias; Investigaré lo de Knott. En Haskell: Nada en contra de Haskell, pero si quisiera hacerlo en un entorno funcional hermoso, simplemente lo haría en Lisp :) – airfoyle

2

lispreader es un simple analizador de archivos Lisp hecho en la llanura C.

Si quieres C++, puede cavar alrededor en est él SuperTux source code, contiene un analizador de archivos Lisp escrito en C++.

Cuando desee una implementación real de Lisp en lugar de solo un analizador, puede echar un vistazo a Abuse, que contiene uno pequeño como el lenguaje de secuencias de comandos de juegos.

+1

Ahora, ¿por qué me hace pensar en la Décima Regla de Greenspun? :) – ephemient

2

profesor del MIT Rivest publicado un conjunto de pequeños lectores de s-expresiones en 1997 http://people.csail.mit.edu/rivest/sexp.html como parte de su DARPA apoyó la investigación sobre criptografía de clave pública. El código solo lee e imprime y está bien descrito en un documento escrito al estilo de un RFC de Internet.

Cuestiones relacionadas