Common Lisp源代码组织

jen*_*wan 7 common-lisp asdf

我是CL的新手,正在使用AllegroCL.我正在试图弄清楚如何组织我的源代码以满足以下要求:

  1. 我想阻止src代码包含我的测试套件.
  2. 我想以可移植的方式声明项目依赖项(src和test deps),以便我团队中的其他成员不必修改他们的系统.
  3. 我希望在签到时简化持续集成,包括构建和测试.

我一直在尝试创造性地使用ASDF来满足这些要求,但我无法做到这一点.其他人如何解决这个问题?这两个要求是不是"Lispy"?

Rai*_*wig 5

使用ASDF或使用Allegro CL defsystem工具.

  1. 让他们两个不同的系统.测试套件系统取决于软件系统.
  2. 使用相对路径名,根据系统定义文件的位置计算绝对路径名,或者'pro'版本,使用逻辑路径名(可以根据规则重新映射的CL中的路径名).
  3. 可能有一个针对Common Lisp的持续集成工具,但我还没有使用过任何工具.有一个defsystem描述是一个良好的开端.


Sim*_*Sim 5

我正在使用quicklisp在你的主文件夹中创建一个"quicklisp"文件夹,其中可以找到"本地项目"文件夹.这个包含一个txt文件,您可以在其中将URI插入.asd文件.

如何使用该实用程序:

  • 在项目文件夹中创建一个"project.asd"和"project-test.asd"

project.asd(管理纯项目代码的包含)

(asdf:defsystem :project-name
  :description "description here"
  :version "version here"
  :author "your name here"
  :depends-on (:a
               :list 
               :of
               :dependencie
               :libraries)
  :components ((:file "sourcefileone")
               (:file "sourcefiletwo")))
Run Code Online (Sandbox Code Playgroud)

project-test.asd(管理测试代码的包含)

(asdf:defsystem :project-name-test
  :description "testing"
  ...
  :depends-on (:project-name)
  :components ((:file "sourcefileone-test")
               (:file "sourcefiletwo-test")))
Run Code Online (Sandbox Code Playgroud)
  • 现在将这些文件的URI插入上面名为local-projects.txt的URI中

  • 程序并行<filename> .lisp文件中的项目源和<filename> -test.lisp文件中的测试调用(*-test.lisp文件必须包含测试执行调用)

  • 启动你的sbcl或你使用的任何东西然后使用(ql:quickload "project-name")(ql:quickload "project-name-test")取决于你是否只想加载项目或测试它.

您必须在其他任何地方移植它的唯一方法是在复制项目的计算机上编写local-projects.txt.之后,您的大学可能会依赖于它使用asdf文件和快速加载他们想要的任何其他项目.要复制项目文件夹,您可以使用ctr + c/v,也可以使用更复杂的git.

为了测试我编写了自己的小型测试套件,但我打赌那里有很好的测试套件.有关quicklisp的更多信息可以在这里找到,关于asdf 在这里.如果你遇到quicklisp,可能这个问题可以帮到你.


mom*_*omo 5

如果安装了Quicklisp,则可以使用内置功能Quickproject.

(ql:quickload "quickproject")
(quickproject:make-project "~/src/lisp/swatchblade/"
                         :depends-on '(vecto hunchentoot))
Run Code Online (Sandbox Code Playgroud)

这会创建4个文件:

  • package.lisp
  • swatchblade.lisp
  • swatchblade.asd
  • 的README.txt

package.lisp定义包名称空间:

(defpackage #:swatchblade  
(:use #:cl)
  (:shadowing-import-from #:vecto
                          #:with-canvas
                          #:rounded-rectangle
                          #:set-rgb-fill
                          #:save-png-stream))
Run Code Online (Sandbox Code Playgroud)

swatchblade.asd定义系统/项目,源代码文件,依赖项等.

(asdf:defsystem #:swatchblade 
 :serial t
  :depends-on (#:vecto
               #:hunchentoot
               #:cl-colors)
  :components ((:file "package")
               (:file "swatchblade")))
Run Code Online (Sandbox Code Playgroud)

swatchblade.lisp是源代码的用武之地.

您可以通过Quicklisp的quickload加载项目:

* (ql:quickload "swatchblade")
loading output
* (swatchblade:start-web-server :port 8080)
Server started on port 8080.
Run Code Online (Sandbox Code Playgroud)

如果您随后创建了另一个依赖于swatchblade系统的项目:

quickproject:make-project "~/src/lisp/whimsytron/" 
                       :depends-on '(swatchblade))
Run Code Online (Sandbox Code Playgroud)

关于测试,您可以在package.lisp中为测试添加另一个命名空间:

    (defpackage #:swatchblade-tests  
      (:use #:cl #:swatchblade))
Run Code Online (Sandbox Code Playgroud)

创建测试文件,编写代码,并将文件添加到系统定义中:

(asdf:defsystem #:swatchblade 
 :serial t
  :depends-on (#:vecto
               #:hunchentoot
               #:cl-colors)
  :components ((:file "package")
               (:file "swatchblade")
               (:file "swatchglade-tests")))
Run Code Online (Sandbox Code Playgroud)

加载swatchblade-tests命名空间以运行测试.

这里有测试示例项目

如果你想避免Quicklisp将所有依赖项安装到系统中,你必须安装依赖项并据我所知手动加载系统.

Quicklisp的作者Zach Beane有一篇关于使用quickproject的更详细的文章.