我正在学习 Lisp (SBCL),我对 lisp 代码的结构感到困惑。我相信 Lisp 包就像 Python 的模块?
我想做这样的事情。
实用程序.py:
def foo():
print "And there is silence!"
主要.py:
import utilities as u
u.foo()
我查找了包、加载和 asdf 系统。我仍然不明白这一切是如何结合在一起的。
关于与 Python 的比较:
包是 CL 中与 Python 模块最相似的东西,因为两者都是命名空间。系统和系统工具(如 ASDF)更类似于 Python 中的 Distutils 和 Setuptools。
Python 模块和 CL 包之间最重要的区别:包独立于文件和目录。相反,您可以使用defpackage
创建包并将use-package
以下代码放入特定包中。还有其他与包相关的操作符,但它们大多是用于交互使用的,这两个是源文件中最重要的。
请参阅Practical Common Lisp 中的相关章节以获取更多详细信息。
包是符号的命名空间。可以从符号导入和导出符号。一个符号可能包含在一个包中。包可以被其他包使用。
程序被构造成系统。系统是文件、依赖项、构建规则、默认信息等的集合——取决于所使用的系统工具。ASDF 就是其中之一。然后通过加载系统来加载库。系统也可以编译、打印、...
包和系统相互独立,不相关。
对于每个较大的软件、库或程序,使用一个或多个自定义包是有意义的。这样可以避免名称与其他加载软件中的符号发生冲突。
如前所述,与其他语言相比:
关于包:为了了解这些(这是避免符号冲突等所必需的),我强烈建议阅读 Ron Garret 的Complete Idiot's Guide to Common Lisp Packages。