在没有提供定义多个命名空间的语言里,工作于大项目的程序员,通常需要想出某些规范(convention),来确保他们不会使用同样的名称。举例来说,程序员写显示相关的代码(display code)可能用 开头的名字,而写数学相关的代码(math code)的程序员仅使用由 math_
开始的代码。所以若是数学相关的代码里,包含一个做快速傅立叶转换的函数时,可能会叫做 math_fft
。
举例来说,假设一个程序分为两个包, math
与 disp
。如果符号 fft
被 math
包导出,则 disp
包里可以用 math:fft
来参照它。在 包里,可以只用 fft
来参照。
defpackage
定义一个新的包叫做 my-application
它使用了其他两个包, common-lisp
与 my-utilities
,这代表着可以不需要用包修饰符(package qualifiers)来存取这些包所导出的符号。许多包都使用了 common-lisp
包 ── 因为你不会想给 Lisp 自带的操作符与变量再加上修饰符。
defpackage
伴随着一个 in-package
,确保当前包是 my-application
。所有其它未修饰的符号会被扣押至 my-application
── 除非之后有别的 in-package
出现。当一个文件被载入时,当前的包总是被重置成载入之前的值。