Lisp 在创建包时,是否最好将defpackage放在单独的文件中

Lisp 在创建包时,是否最好将defpackage放在单独的文件中,lisp,package,common-lisp,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 Seibel的实用通用Lisp link中,他说: 由于程序包由读取器使用,因此必须定义程序包 在您可以加载或编译一个包

以下示例在Paul Grahams ANSI Common Lisp中给出,作为进行封装的示例:

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

(in-package ctr)

;function definitions here
然而,在Peter Seibel的实用通用Lisp link中,他说:

由于程序包由读取器使用,因此必须定义程序包 在您可以加载或编译一个包含内部包的文件之前 表达式切换到该包。还必须定义包 在其他DEFPACKAGE表单引用它们之前。。。 确保包在需要时存在的最佳第一步 to是将所有DefPackage放在与所使用的代码分开的文件中 需要在这些包中阅读

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


在我看来,将defpackage放在同一个文件中,放在in包和代码之前,是确保在使用包之前定义包的一个好方法。因此,第一种方法,将所有内容收集到一个文件中似乎更容易。使用此方法创建包有什么问题吗?

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

  • 您不会用
    defpackage
    污染您的文件
  • 这样可以更容易地找到导出/阴影/。。。符号,你 知道你只需要看看
    package.lisp
  • 使用ASDF时,您不必担心订单

    (defsystem :your-system
      :components ((:file "package")
                   ... the rest ...))`
    
  • 彼得·塞贝尔是这么说的;)

编辑: 我忘了提到有助于创建 新的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(已填充)
  • 我的精彩项目.lisp
  • README.txt

因此,我认为使用相同的约定是好的。

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

将DEFPACKAGE放在自己的文件中的原因是:如果您有一个大包,那么您可能有多组相关函数,您可能希望每个函数组有单独的源文件。然后,所有源文件的顶部都会有自己的包内文件,但它们都会“共享”外部文件包。然后,只要先加载DEFPACKAGE,加载其他源文件的顺序就无关紧要了


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

我认为顺序是最重要的原因,还有一个:包被分割成多个文件。我同意你的观点,除了单文件项目,你可以把包定义放在同一个文件中。顺便说一句,这不是标准所禁止的。使用ASDF时多个文件和排序是有意义的。前两点更像是个人偏好。