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