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

sno*_*ape 9 lisp common-lisp package

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

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

(in-package ctr)

;function definitions here
Run Code Online (Sandbox Code Playgroud)

然而,在Peter Seibels Practical Common Lisp中,链接到这里,他说:

由于读取器使用了包,因此必须先定义包,然后才能对包含切换到该包的IN-PACKAGE表达式的文件进行LOAD或COMPILE-FILE操作.在其他DEFPACKAGE表单可以引用它们之前还必须定义包...在需要时确保包存在的最好的第一步是将所有DEFPACKAGE文件与需要在这些包中读取的代码分开放置

所以他建议为每个包创建两个文件,一个用于defpackage,一个用于代码.包含defpackages的文件应该以(包内"COMMON-LISP-USER")开头.

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

Dai*_*rod 10

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

  • 你没有"污染"你的文件defpackage.
  • 它可以更容易地找到导出/阴影/ ...符号,你知道你只需要看一下package.lisp.
  • 使用ASDF时无需担心订单.

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

编辑:我忘了提及quickproject哪些方便了新CL项目的创建.

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

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

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

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

  • 我认为订单是最重要的原因,还有另外一个:包拆分多个文件. (2认同)