Common lisp 公共Lisp源代码组织
我是CL的新手,正在使用AllegroCL。我试图找出如何组织源代码以满足以下要求:Common lisp 公共Lisp源代码组织,common-lisp,asdf,Common Lisp,Asdf,我是CL的新手,正在使用AllegroCL。我试图找出如何组织源代码以满足以下要求: 我想阻止src代码包含我的测试套件 我想以可移植的方式声明项目依赖项(src和test-dep),这样团队中的其他成员就不必修改他们的系统 我想简化签入的持续集成,包括构建和测试 我一直在尝试创造性地使用ASDF来满足这些需求,但我做不好。其他人如何处理这个问题?这两项要求是否不是“Lispy”?使用ASDF或使用Allegro CL defsystem工具 让它们成为两个不同的系统。测试套件系统取决于软件系统
我一直在尝试创造性地使用ASDF来满足这些需求,但我做不好。其他人如何处理这个问题?这两项要求是否不是“Lispy”?使用ASDF或使用Allegro CL defsystem工具
我正在使用quicklisp,它在您的主文件夹中创建一个“quicklisp”文件夹,您可以在其中找到一个“本地项目”文件夹。这个文件包含一个txt文件,您可以在其中将URI插入到.asd文件中 如何使用该实用程序:
- 在项目文件夹中创建“project.asd”和“project test.asd”
- 现在,将这些文件的URI插入上面命名的local-projects.txt中
- 对
.lisp文件中的项目源和 -test.lisp文件中的测试调用进行并行编程(*-test.lisp文件必须包含测试执行调用) - 启动sbcl或您使用的任何东西,然后使用
或(ql:quickload“project name”)
,具体取决于您是否只想加载或测试项目(ql:quickload“project name test”)
可以找到有关quicklisp和asdf的更多信息。如果您在配置quicklisp时遇到困难,也许可以帮助您。根据Rainer的建议,我建议您使用ASDF系统定义工具来定义两个系统:主系统foo和辅助系统foo测试 在foo系统的定义中,添加一个规范
,为了在foo上执行测试操作
,您需要在foo测试上执行测试操作
。这确保了如果执行(asdf:testsystem“foo”)
,将加载相应的测试系统及其依赖项,然后asdf将执行test-op
我发现FiveAM是构建测试的适当库
上面的内容将加载所有内容,但是现在您需要确保在foo测试上执行testop
,实际运行测试!为此,您需要为TEST-OP
和(eql(查找系统“foo测试”)
在PERFORM
上添加一个方法。该PERFORM
方法应该调用您定义的所有FiveAM测试,并且要么成功,要么在测试失败时引发错误
我为ASDF制作了一个FiveAM测试仪附加组件。我将尝试将其公开。如果安装了Quicklisp,您可以使用内置功能Quickproject
(ql:quickload "quickproject")
(quickproject:make-project "~/src/lisp/swatchblade/"
:depends-on '(vecto hunchentoot))
这将创建4个文件:
- package.lisp
- swatchblade.lisp
- swatchblade.asd
- 自述文件
package.lisp定义包名称空间:
(defpackage #:swatchblade
(:use #:cl)
(:shadowing-import-from #:vecto
#:with-canvas
#:rounded-rectangle
#:set-rgb-fill
#:save-png-stream))
swatchblade.asd定义系统/项目、源代码文件、依赖项等
(asdf:defsystem #:swatchblade
:serial t
:depends-on (#:vecto
#:hunchentoot
#:cl-colors)
:components ((:file "package")
(:file "swatchblade")))
lisp是源代码的来源
您可以通过Quicklisp的quickload加载项目:
* (ql:quickload "swatchblade")
loading output
* (swatchblade:start-web-server :port 8080)
Server started on port 8080.
如果随后创建另一个依赖于样例刀片系统的项目:
quickproject:make-project "~/src/lisp/whimsytron/"
:depends-on '(swatchblade))
关于测试,您可以在package.lisp中为测试添加另一个命名空间:
(defpackage #:swatchblade-tests
(:use #:cl #:swatchblade))
创建测试文件,编写代码,并将该文件添加到系统定义中:
(asdf:defsystem #:swatchblade
:serial t
:depends-on (#:vecto
#:hunchentoot
#:cl-colors)
:components ((:file "package")
(:file "swatchblade")
(:file "swatchglade-tests")))
加载样例刀片测试命名空间以运行测试
如果希望避免Quicklisp将所有依赖项安装到系统中,就我所知,您必须安装依赖项并手动加载系统
Quicklisp的作者扎克·比恩(Zach Beane)在上有一篇更详细的文章 重要的
上面的建议是好的,但是你在尝试测试未导出的东西时会感到沮丧。一个简单的解决方法不是定义两个包。只需将测试与其他来源放在同一个包中即可。有什么害处
如果你认为会有伤害,那么你必须这样做:
(defpackage #:sources
(:use #:cl))
(defpackage #:tests
(:use #:cl #:lisp-unit)
(:import-from #:sources))
重要的部分是:从
导入源程序包,而不是:使用它
然后,当您在测试包中使用源包中的符号时,您必须对它们进行限定。例如,假设您具有以下功能:
(defun return-true () t)
您的测试可能如下所示:
(define-test test-return-true
"Make sure it works"
(assert-equal t (sources::return-true)))
重要的部分是你说的是(sources::return true)
,而不仅仅是(return true)
。类似于'sym
的符号也是如此;将其称为'sources::sym
酷。我一直在尝试使用ASDF。如何声明相对依赖关系?:在asdf中,defsystem依赖于:defsystem不采用路径名,只采用系统名。我试着打电话给asdf:initialize-
(defun return-true () t)
(define-test test-return-true
"Make sure it works"
(assert-equal t (sources::return-true)))