1

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

4

2 回答 2

2

不是开箱即用,但您可以安排类似的事情。更改系统加载文件的最简单方法是将 #+/- 与*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。

于 2015-04-10T05:21:31.487 回答
2

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

此外,进行运行时差异化或根据功能完全拥有不同的系统目标要比拥有一个以构建系统无法看到的不负责任的方式改变其含义的目标要好得多。

于 2015-04-10T16:04:20.913 回答