在创建包时将defpackage放在单独的文件中是否更好?

时间:2011-12-07 13:26:07

标签: lisp package common-lisp

以下示例在Paul Grahams ANSI Common Lisp中作为封装示例提供:

(defpackage "CTR"
  (:use "COMMON-LISP")
  (:export "COUNTER" "INCREMENT" "CLEAR"))

(in-package ctr)

;function definitions here

然而,在Peter Seibels Practical Common Lisp中,链接here,他说:

  

由于阅读器使用了包,因此必须定义包   在您可以LOAD或COMPILE-FILE包含IN-PACKAGE的文件之前   表达式切换到该包。包也必须定义   在其他DEFPACKAGE表格之前可以参考它们......   确保软件包在需要时存在的最佳第一步   to将所有DEFPACKAGE文件放在与代码分开的文件中   需要在这些包中阅读

因此他建议为每个包创建两个文件,一个用于defpackage,另一个用于代码。包含defpackages的文件应该以(in-package" COMMON-LISP-USER")开头。

对我来说,似乎在包内和代码之前将defpackage放在同一个文件中是确保在使用之前定义包的好方法。所以第一种方法,将所有内容收集到一个文件中似乎更容易使用此方法创建包时是否有任何问题?

3 个答案:

答案 0 :(得分:9)

我认为为defpackage使用单独的文件是一个好习惯 这是因为:

  • 您没有使用defpackage“污染”您的文件。
  • 您可以更轻松地找到导出/阴影/ ...符号 知道你只需看看package.lisp
  • 使用ASDF时无需担心订单。

    (defsystem :your-system
      :components ((:file "package")
                   ... the rest ...))`
    
  • Peter Seibel这么说;)

编辑: 我忘了提及促进创建的quickproject 新的CL项目。

REPL> (quickproject:make-project "~/src/lisp/my-wonderful-project/"
                                 :depends-on '(drakma cl-ppcre local-time))`

此命令将创建目录“~/src/lisp/my-wonderful-project/” 和以下文件:

  • package.lisp
  • my-wonderful-project.asd (filled)
  • my-wonderful-project.lisp
  • README.txt

因此,我认为使用相同的惯例是好的。

答案 1 :(得分:1)

对于我的大多数项目,我倾向于使用多个源代码文件,一个“packages.lisp”文件和一个单独的“project.asd”系统定义文件。如果项目需要多个包,则它们都在“packages.lisp”中定义,并且导出了相关的导出。

答案 2 :(得分:0)

将DEFPACKAGE放在自己的文件中是有这个原因的:如果你有一个大包,那么你可能有几组相关的函数,并且你可能希望每个函数组都有单独的源文件。然后所有的源文件都会在顶部有自己的IN-PACKAGE,但是他们会全部共享"分享"外部DEFPACKAGE。然后,只要您首先加载DEFPACKAGE,加载其他源文件的顺序就不重要了。

我目前正在处理的一个例子是包中有多个类,源文件被分解为每个类,每个类都有一个类定义以及相关的泛型函数和方法定义。