我真正想要的是源内测试定义:
假设我有一个 asdf 系统:
(defsystem simple-system
:serial t
:components ((:module "src"
:components
((:file "0-package")
(:file "1-tests-stubs")
(:file "2-code") ...))))
还有另一个系统来测试第一个系统:
(defsystem simple-system-tests
:serial t
:components ((:module "src"
:components
((:file "0-package")
(:file "1-tests-real")
(:file "2-code") ...))))
它们之间唯一的区别是在simple-system
I have 1-tests-stubs
在哪里simple-system-tests
I have 1-tests-real
.
In 1-tests-stubs
我定义了一个宏(defmacro def-test (&rest _args) nil)
这得到了一个“真正的”实现1-tests-real
.
现在我想编译simple-system
with (declare (optimize (safety 0) (debug 0) (speed 3)))
和simple-system-tests
与相反的(declare (optimize (safety 3) (debug 3) (speed 0)))
.
我该怎么做(在哪里放置以及如何以这两个系统的通用方式设置这些声明)?
我怎样才能重用定义simple-system
in the simple-system-tests
(不要重复自己重新输入所有模块/组件)?
我必须确保所有文件都针对每个系统使用不同的优化级别重新编译。
另外,如果每个系统文件仅在更改时才重新编译(每个系统的已编译文件的自己的副本?),那就太好了。
优化,安全性低。
一般来说我会not建议以零安全性编译整个系统(库或应用程序),如下所示:
(declare (optimize (safety 0) (debug 0) (speed 3)))
将零安全性与类型声明结合使用可能会改变程序的语义,并且错误可能会使程序崩溃。它甚至可能会打开安全漏洞。
我对生产代码的建议是这样的:
使优化设置可以更改
* (defparameter *safety* 0)
这是行不通的,因为安全值需要是数字:
*SAFETY*
* (defun foo (a) (declare (optimize (safety *safety*))) (1+ a))
; in: DEFUN FOO
; (OPTIMIZE (SAFETY *SAFETY*))
;
; caught WARNING:
; Ignoring bad optimization value *SAFETY* in: (OPTIMIZE (SAFETY *SAFETY*))
;
; compilation unit finished
; caught 1 WARNING condition
FOO
但这是有效的,使用读取时评估:
* (defun foo (a) (declare (optimize (safety #.*safety*))) (1+ a))
WARNING: redefining COMMON-LISP-USER::FOO in DEFUN
FOO
还可以插入整个声明:
* (defparameter *optimization-declaration* '(declare (optimize (safety 0))))
*OPTIMIZATION-DECLARATION*
* (defun foo (a) #.*optimization-declaration* (1+ a))
WARNING: redefining COMMON-LISP-USER::FOO in DEFUN
FOO
*
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)