首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么必须在单独的表达式中计算'require‘才能使用包

为什么必须在单独的表达式中计算'require‘才能使用包
EN

Stack Overflow用户
提问于 2009-07-06 22:55:11
回答 2查看 188关注 0票数 5

我有一些lisp初始化代码:

代码语言:javascript
复制
(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*))

为什么这个版本会编译,而这个版本:

代码语言:javascript
复制
(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的内置版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-07 00:04:59

以下可能在某些细节上不准确,但大致是这样的:

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

每个顶层表单首先被完整地读入。然而,阅读涉及到对各个符号的解析。由于在读取eval-when表单时尚未加载ASDF,因此尚无法解析symbol asdf:*central-registry*,这会产生上述读取错误。

票数 9
EN

Stack Overflow用户

发布于 2009-07-07 11:18:59

请看Svante的答案。

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

代码语言:javascript
复制
(push somepath (symbol-value (find-symbol "*CENTRAL-REGISTRY*" "ASDF")))

可以使用上面的代码,因为符号asdf:*central registry*不是直接使用的,而是在运行时使用符号名称和包名进行查找。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1089574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档