2011-09-23 14 views
7

Estoy leyendo el libro Structure and Interpretation of Computer Programs, y me gustaría programar un intérprete de esquema gradualmente.Quiero implementar un intérprete de esquema para estudiar SICP

¿Conoce la implementación del esquema más fácil de leer (y corto)? haré un JavaScript en C.

+1

Después de leer SICP, me parece que obtendrías más de escribir tu intérprete en Scheme (o algún otro dialecto Lisp - Me gusta Clojure) y haciendo algunos de los ejercicios que si no escribes el intérprete en C. – mwd

+2

¿Qué tan lejos estás de SICP? Escribirá un intérprete de Scheme (en realidad más de uno) y un compilador en el transcurso de la lectura de los capítulos 4 y 5. Si termina el libro, encontrará lo que busca: el intérprete metacircular (Scheme in Scheme) está bellamente corto. – spacemanaki

Respuesta

4

El libro de Christian Queinnec Lisp In Small Pieces is superb. Más moderno que EoPL. Cubre tanto Lisp como Scheme, y entra en detalles sobre las sangrientas cosas de bajo nivel que omiten la mayoría de los libros.

+0

Tampoco es muy adecuado para principiantes. – leppie

1

Recomendaría leer la disertación de Kent Dybvig "Three Implementation Models for Scheme". No toda la disertación, pero la primera parte (hasta el capítulo 3) en la que analiza el Modelo basado en el montón es muy adecuada para una implementación ingenua del Esquema.

Otro gran recurso (si lo entendí correctamente y desea implementarlo en C) es Nils Holm's "Scheme 9 from Empty Space". Este enlace es para la página de Nils, y hay un enlace en la parte inferior de la edición anterior del dominio público y para la edición más nueva, más fácil de leer y disponible comercialmente. Léalos y amados.

0

Te puedo dar una visión general de cómo funciona mi intérprete, tal vez se le puede dar una idea de lo general. Aunque la respuesta es bastante tarde, espero que esto pueda ayudar a alguien más, que ha llegado a este hilo y quiere una idea general.

  1. Para cada línea de esquema ingresada, se crea un objeto Command. Si el comando es parcial, se almacena su nivel de jerarquía (número de corchetes remanentes restantes para completar la expresión). Si el comando está completo, se crea un objeto de expresión y los evaluadores se activan en este objeto.
  2. Hay 4 tipos de clases evaluador definidos, cada uno derivados de la Evaluador clase base

a) Define_Evaluator: para definir estados

b) Funcall_Evaluator: para el procesamiento de otras funciones definidas por el usuario

c) Read_Evaluator: para leer una expresión y convertirla en un objeto de esquema

d) Print_Evaluator: imprime el objeto según el tipo de objeto.

e) Eval_Evaluator: realiza el procesamiento real de la expresión.

3 .-> Primero, cada expresión se lee usando el Evaluador de Lectura que creará un objeto de esquema fuera de la expresión. Las expresiones anidadas se calculan recursivamente hasta que la expresión se completa.

-> A continuación, se ejecuta el Eval_Evaluator que procesa el objeto de expresión de esquema formado en el primer paso. esto sucede como

a) si la expresión a evaluar es un símbolo. Devuelve su valor Por lo tanto, la variable blk devolverá el objeto para ese bloque.

b) si la expresión a evaluar es una lista. Imprima la lista.

c) si la expresión que se va a evaluar es una función. Busque la definición de la función que devolverá la evaluación utilizando Funcall_Evaluator.

-> Por último, el evaluador de impresión se activa para imprimir el resultado, esta impresión dependerá del tipo de expresión de salida.

responsabilidad: Esta es la forma en que funciona mi intérprete, no tiene que ser de esa manera.

0

He estado en una misión similar, pero varios años después, las recomendaciones: Esquema de

Todavía estoy buscando buenas publicaciones de blog sobre cómo crear una máquina virtual de lisp/scheme, que podría combinarse con JIT (importante para cualquier implementación competitiva de JS :).

Cuestiones relacionadas