gpt4 book ai didi

common-lisp - 使用 ASDF 的 :around-compile For Individual Files

转载 作者:行者123 更新时间:2023-12-04 02:28:43 25 4
gpt4 key购买 nike

SO post包含 coredump 的响应显示了如何将编译器策略应用于 ASDF 系统的组件文件:

(defsystem simple-system
:serial t
:around-compile (lambda (next)
(proclaim '(optimize (debug 3)
(safety 3)
(debug 3)
(speed 0)))
(funcall next))
:components ((:module "src"
:components
(...))))

它还提到您可以“隐藏”单个文件,但这是如何工作的。这让我感到困惑,因为 lambda 表达式中的 next 绑定(bind)到一个闭包。由于我只需要将优化应用于几个组件文件,您如何将这些文件名赋予 :around-compile

最佳答案

您可以为系统、模块或文件添加:around-compile

更准确地说,如果你有这样一个 :file 组件:

(:file "a")

然后你可以添加:

(:file "a" :around-compile ...)

如果您只想对一组给定的文件应用优化,请将它们分组到一个模块中。您甚至可以将模块的 pathanme 设置为 "",以便它的文件与同级组件位于同一目录中:

(:module #:MY-OPTIMIZED-FILES
:depends-on (...)
;; SAME DIRECTORY
:pathname ""
:serial t
:around-compile "my-meta-lib:around-compile"
:components ((:file "a")
(:file "b")
(:file "c")
(:file "d")))

如果定义符号的系统未加载,则无法引用符号,并且在 ASDF 系统的情况下,如果不先阅读定义系统的表格,则无法声明依赖项。所以你需要使用字符串来引用另一个包中的符号。

当系统处理时,字符串必须引用一个存在的符号,所以你需要有一个不同的 .asd 文件,例如 simple-system.meta.asd,它定义了系统 "simple-system.meta"。您使用 :defsystem-depends-on 添加依赖项,以确保在处理 simple-system 之前加载 meta 系统。

例如,该系统可能是:

(defsystem simple-system.meta
:depends-on ("trivial-cltl2")
:components ((:file "meta")))

我使用 trivial-cltl2 的原因是能够在全局环境中反省声明并希望限制 proclaim 的影响:

(defun my-meta-lib:around-compile (next)
(let ((opt (trivial-cltl2:declaration-information 'optimize)))
(proclaim '(optimize (debug 3)
(safety 3)
(debug 3)
(speed 0)))
(unwind-protect (funcall next)
(proclaim (list* 'optimize opt)))))

据我所知,proclaim修改了全局环境,它可能会影响其他文件的编译,所以我更喜欢在编译完成后恢复环境。

SBCL 有一个针对 with-compilation-unit 的实验性 :policy 选项,它是为这个用例制作的,该策略在宏的动态范围内进行了修改:

(flet ((debug () (assoc 'debug (sb-cltl2:declaration-information 'optimize))))
(list (debug)
(with-compilation-unit (:policy '(optimize (debug 3)))
(debug))
(debug)))

; => ((DEBUG 1) (DEBUG 3) (DEBUG 1))

关于common-lisp - 使用 ASDF 的 :around-compile For Individual Files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65573027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com