Lisp代码是如何构建的?什么是包装和系统?

时间:2011-02-16 19:09:38

标签: lisp sbcl

我正在学习Lisp(SBCL),我对lisp代码的结构感到困惑。我相信Lisp包就像Python的模块一样?

我想做这样的事情。

utilities.py:

def foo():
    print "And there is silence!"

main.py:

import utilities as u

u.foo()

我查找了包,加载和asdf系统。我仍然不明白这一切是如何融合在一起的。

3 个答案:

答案 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