Common lisp 公共Lisp源代码组织

Common lisp 公共Lisp源代码组织,common-lisp,asdf,Common Lisp,Asdf,我是CL的新手,正在使用AllegroCL。我试图找出如何组织源代码以满足以下要求: 我想阻止src代码包含我的测试套件 我想以可移植的方式声明项目依赖项(src和test-dep),这样团队中的其他成员就不必修改他们的系统 我想简化签入的持续集成,包括构建和测试 我一直在尝试创造性地使用ASDF来满足这些需求,但我做不好。其他人如何处理这个问题?这两项要求是否不是“Lispy”?使用ASDF或使用Allegro CL defsystem工具 让它们成为两个不同的系统。测试套件系统取决于软件系统

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

  • 我想阻止src代码包含我的测试套件
  • 我想以可移植的方式声明项目依赖项(src和test-dep),这样团队中的其他成员就不必修改他们的系统
  • 我想简化签入的持续集成,包括构建和测试

  • 我一直在尝试创造性地使用ASDF来满足这些需求,但我做不好。其他人如何处理这个问题?这两项要求是否不是“Lispy”?

    使用ASDF或使用Allegro CL defsystem工具

  • 让它们成为两个不同的系统。测试套件系统取决于软件系统
  • 使用相对路径名,根据系统定义文件的位置计算绝对路径名,或者在“pro”版本中,使用逻辑路径名(CL中的路径名,可以根据规则重新映射)
  • 可能有一个用于CommonLisp的持续集成工具,但我还没有使用过。有一个系统描述是一个好的开始

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

    如何使用该实用程序:

    • 在项目文件夹中创建“project.asd”和“project test.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”)
      ,具体取决于您是否只想加载或测试项目

    将其移植到其他任何地方所要做的唯一一件事就是在复制项目的计算机上编写local-projects.txt。在那之后,你的大学可能会依赖于它,在他们想要的任何其他项目中使用asdf文件和quickload。要复制项目文件夹,您可以使用ctr+c/v,也可以使用更复杂的git

    为了进行测试,我编写了自己的小测试套件,但我敢打赌一定有好的。
    可以找到有关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)))