2009-07-06 7 views
5

Ho qualche codice di inizializzazione lisp:Perché deve 'require' essere valutato in un'espressione separata di utilizzare del pacchetto

(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*)) 

Perché quella versione di compilazione, mentre questa versione:

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

produce un errore durante la compilazione del file nella 3a riga, con asdf un pacchetto non riconosciuto?

Sto usando ccl, e (richiede 'asdf) è documentato come portare nella versione integrata di ASDF.

risposta

9

Possono essere imprecise in alcuni dettagli, ma è di circa così:

Ci sono quattro fasi che il "motore" Lisp passa attraverso: leggere il tempo, tempo di espansione macro, compilare il tempo, e il tempo di esecuzione .

Ogni modulo di livello superiore viene letto per la prima volta completamente. La lettura, tuttavia, implica la risoluzione dei rispettivi simboli. Poiché ASDF non è ancora stato caricato durante il tempo di lettura del tuo modulo , il simbolo asdf:*central-registry* non può ancora essere risolto e questo produce l'errore di lettura citato.

4

Vedere la risposta di Svante.

A volte potresti voler risolvere il problema. Quindi è necessario cercare il simbolo nel codice in RUNTIME.

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

Sopra codice può essere utilizzato, in quanto il simbolo asdf: * centro-registro * non viene utilizzato direttamente, ma alzò gli occhi in fase di esecuzione utilizzando il nome del simbolo e il nome del pacchetto.