2011-06-15 14 views
20

Así que ahora tengo un intérprete bastante completo de LISP (esquema) escrito en haskell. Solo por diversión, quiero intentar que se compile hasta LLVM. La mayor parte de la generación de código parece bastante sencilla, pero no sé cómo generar código para una expresión lambda (algo importante en lisp;) y cómo administrar el montón cuando encuentro una expresión define.Generando código LLVM para 'lambda', 'define'

¿Cómo podría generar código para estas expresiones?

Nota: Puedo generar código para el cuerpo de la expresión lambda, Lo que me confunde es cómo "poner" ese código en algún lugar y hacerlo invocable.

+2

Es posible que desee implementar un pase de elevación lambda explícito antes de la generación de su código (y dado que es Scheme, es probable que esté haciendo una transformación CPS antes de eso) . Te dejará solo con las funciones globales y una asignación explícita de envorons de cierre. –

Respuesta

10

Ver el blog de Lennart: http://augustss.blogspot.com/2009/06/more-llvm-recently-someone-asked-me-on.html

observar la función compileFunction. En particular, newFunction en el núcleo LLVM: http://hackage.haskell.org/packages/archive/llvm/0.9.1.2/doc/html/LLVM-Core.html#g:23

+0

El idioma que se compila en la publicación del blog es de primer orden y no maneja cierres en absoluto. No veo cómo eso es útil para compilar el esquema lambdas. – sepp2k

+1

@ sepp2k Primero tendrá que hacer la conversión de cierre, lo que supongo que está haciendo John, ya que está leyendo SICP. –

+0

Podría estar equivocado, pero no recuerdo que la conversión de cierre esté cubierta en el SICP. – spacemanaki