2009-07-06 8 views
5

Tengo algún código de inicialización Lisp:¿Por qué debe 'require' ser evaluados en una expresión separada con el uso del paquete de

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf)) 

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

¿Por qué compilar esa versión, mientras que esta versión:

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

produce un error durante el compile-file en la 3ra línea, con asdf un paquete no reconocido?

Estoy usando ccl, y (requiere 'asdf) está documentado como traer la versión incorporada de ASDF.

Respuesta

9

lo siguiente puede ser inexacta en algunos detalles, pero es aproximadamente así:

Hay cuatro fases que el "motor" Lisp pasa por: leer el tiempo, el tiempo de expansión de la macro, el tiempo de compilación y tiempo de ejecución .

Cada formulario de nivel superior se lee por completo en primer lugar. La lectura, sin embargo, implica la resolución de los respectivos símbolos. Debido a que ASDF aún no se ha cargado durante el tiempo de lectura de su formulario eval-when, el símbolo asdf:*central-registry* no se puede resolver todavía, y esto produce el error de lectura mencionado.

4

Ver la respuesta de Svante.

Algunas veces es posible que desee evitar esto. Luego, debe buscar el símbolo en el código en RUNTIME.

(push somepath (symbol-value (find-symbol "*CENTRAL-REGISTRY*" "ASDF"))) 

Por encima de código se puede utilizar, porque el símbolo asdf: * * centro-registro no se utiliza directamente, sino que alzó la vista en tiempo de ejecución utilizando el nombre del símbolo y el nombre del paquete.

Cuestiones relacionadas