Tengo problemas para entender qué sucede con las macros leídas al compilar un archivo de código lisp en un bytecode o ensamblado sin formato (o un archivo fasl para el caso). O tal vez lo entiendo pero no sé. Estoy realmente confundido.Compilación de código Lisp con macros de lectura
Cuando utiliza una macro de lectura, ¿no tiene que tener la fuente disponible?
Si lo hace, entonces tiene que estar ejecutando el código fuente que conforma la función de la macro de lectura. Si no lo haces, ¿cómo pueden funcionar cuando puedes hacer cosas como read-char
?
Para hacer eso, si quiere que la macro de lectura use variables predefinidas, tiene que estar ejecutando todo el código anterior, por lo que esto se convierte en tiempo de ejecución que arruina todo.
Si no ejecuta el código antes, entonces las cosas definidas anteriormente no estarán disponibles.
¿Qué ocurre con las funciones o las macros del compilador que definen las macros de lectura? Supongo que no funcionarían a menos que require
o load
un archivo o algo que no se haya compilado. Pero si fueran compilados, ¿entonces no podrían usarlos?
Si algunas de mis suposiciones son correctas, significa que hay una gran diferencia en "qué datos estarán disponibles para las macros" y "qué macros estarán disponibles para las funciones" dependiendo de si está compilando un archivo completo para ejecute más tarde o interprete un archivo una línea a la vez (es decir, leyendo, compilando y evaluando una expresión después de otra).
En resumen, parece que para compilar una línea a un formulario donde se puede ejecutar sin más procesamiento de macros o lo que sea, debe leer, compilar y ejecutar las líneas anteriores.
Recuerda una vez más que estas preguntas se aplican a la compilación de Lisp, no interpretarlo donde puede ejecutar cada línea, ya que viene en.
Lo siento por mi laberíntica, pero yo soy nuevo en Lisp y quiero saber más acerca de cómo se trabajos.
En realidad, SBCL tiene el modo de interpretación, simplemente está desactivado por defecto: http://www.sbcl.org/manual/Interpreter.html –
La compilación Common Lisp es incremental, pero la compilación de archivos se define de forma ligeramente diferente. –
@Rainer ¿puedes dar más detalles? No estoy familiarizado con él –