Lisp 在创建包时,是否最好将defpackage放在单独的文件中
以下示例在Paul Grahams ANSI Common Lisp中给出,作为进行封装的示例: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中,他说: 由于程序包由读取器使用,因此必须定义程序包 在您可以加载或编译一个包
(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 ...))`
- 彼得·塞贝尔是这么说的;)
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时多个文件和排序是有意义的。前两点更像是个人偏好。