Common Lisp:如何让ASDF对已加载的系统定义进行操作
如何加载已构造的ASDF系统定义S表达式
你可以直接对(defsystem "foo" ...)这类系统定义S表达式求值,ASDF的defsystem宏会自动将该系统注册到内部注册表中,之后就能用常规的asdf:load-op或asdf:load-system加载它。
具体步骤示例:
- 构造或读取系统定义的S表达式:
(defparameter *my-system-def* '(defsystem "my-test-system" :components ((:file "main") (:file "utils")))) - 求值该表达式完成系统注册:
(eval *my-system-def*) - 加载系统:
(asdf:operate 'asdf:load-op "my-test-system") ; 或者更简洁的写法 (asdf:load-system "my-test-system")
进阶:直接构造系统实例加载
如果不想通过defsystem宏,也可以手动创建ASDF系统类的实例并注册,再加载:
(let ((my-system (make-instance 'asdf:system :name "my-test-system" :components (list (make-instance 'asdf:file-component :pathname "main") (make-instance 'asdf:file-component :pathname "utils"))))) (asdf:register-system my-system) (asdf:load-system my-system))
这种方式跳过defsystem宏的语法解析,直接操作系统对象,适合需要动态生成系统定义的场景,但需要手动处理组件实例化的细节。
注意:直接使用
eval时要确保系统定义的S表达式安全,避免执行不可信代码。
内容的提问来源于stack exchange,提问作者Robert Dodier
相关产品推荐
相关产品推荐

