ASDF 系统配置变量?

ASDF System Configuration Variables?

有没有办法制作一个可配置的 ASDF 系统,根据用户配置变量加载不同的 lisp 文件? 如果未提供所需的配置变量,加载过程最好会失败并显示清晰的错误消息。 如何在加载系统时方便地设置这些变量? (手动,通过 quicklisp,或来自另一个系统定义文件)

并非开箱即用,但您可以安排类似的东西。更改系统加载文件的最简单方法是结合使用 #+/- 和 *features*.

添加功能的一种方法是在 .sbclrc(或您的实现启动文件)中,如果您想要更具体的项目,您可以在系统上定义一个 perform :before load-op 来调用一个函数,该函数将读取一个文件,根据其内容,它可以修改 *features* 以便读取不同的组件。我使用这个方案来加载配置文件的变量。

所以如果我的系统是 foo

(defsystem #:foo
  ...
  :dependencies (#:foo-config)
 ...)

(defmethod perform :after ((op load-op)
                           (system (eql (find-system :foo-config))))
  (asdf/package:symbol-call :foo/config-loader 'load-config
                            (system-relative-pathname :foo-config
                                                      #P"foo.config")))

因为#+/- 在读取时工作,我猜它不会工作,因为在阅读系统定义后会修改这些功能。解决这个问题的一个 hacky 方法可能是只需要配置系统,并在设置功能后让 after 方法需要系统。

我的 2c.

请不要在 defsystem 形式中使用 #+ 和 #-,而是使用 :if-feature。

此外,根据功能进行运行时区分或拥有完全不同的系统目标比拥有以构建系统看不到的无法解释的方式改变其含义的目标要好得多。