You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Common Lisp:如何让ASDF对已加载的系统定义进行操作

如何加载已构造的ASDF系统定义S表达式

你可以直接对(defsystem "foo" ...)这类系统定义S表达式求值,ASDF的defsystem宏会自动将该系统注册到内部注册表中,之后就能用常规的asdf:load-op或asdf:load-system加载它。

具体步骤示例:

  1. 构造或读取系统定义的S表达式:
    (defparameter *my-system-def*
      '(defsystem "my-test-system"
         :components ((:file "main")
                      (:file "utils"))))
    
  2. 求值该表达式完成系统注册:
    (eval *my-system-def*)
    
  3. 加载系统:
    (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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:15:40