Lisp 为什么必须';要求';在单独的表达式中求值以使用包

Lisp 为什么必须';要求';在单独的表达式中求值以使用包,lisp,common-lisp,Lisp,Common Lisp,我有一些lisp初始化代码: (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*)) 为什么要编译该版本,而此版本: (eval-when (:compile-topl

我有一些lisp初始化代码:

(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*))
为什么要编译该版本,而此版本:

(eval-when (:compile-toplevel :load-toplevel :execute)
  (require 'asdf)
  (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*))
在第三行编译文件时产生错误,asdf包无法识别


我正在使用ccl,并且(require'asdf)被记录为引入了asdf的内置版本。

以下内容在某些细节上可能不准确,但大致如下:

Lisp“引擎”经历四个阶段:读取时、宏扩展时、编译时和运行时


每个顶级表单首先被完全读入。然而,阅读涉及到各自符号的解析。由于ASDF在
eval when
窗体的读取期间尚未加载,因此符号
ASDF:*中央注册表*
尚未解析,这会产生所述的读取错误。

请参阅Svante的答案

有时候你可能想解决这个问题。然后,您需要在运行时在代码中查找符号

(push somepath (symbol-value (find-symbol "*CENTRAL-REGISTRY*" "ASDF")))
可以使用上面的代码,因为符号asdf:*centralregistry*不直接使用,而是在运行时使用符号名和包名进行查找