Lisp代码是如何构造的?什么是软件包和系统?

Lisp代码是如何构造的?什么是软件包和系统?,lisp,sbcl,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系统。我仍然不明白它是如何组合在一起的。包是符号的名称空间。可以从符号导入和导出符号。一个符号可能在一个包裹里。包可以被其他包使用 程序被组织成多个系统

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

我想做这样的事

utilities.py:

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

import utilities as u

u.foo()

我查过包裹、装载和asdf系统。我仍然不明白它是如何组合在一起的。

包是符号的名称空间。可以从符号导入和导出符号。一个符号可能在一个包裹里。包可以被其他包使用

程序被组织成多个系统。系统是文件、依赖项、构建规则、默认信息等的集合,具体取决于所使用的系统工具。ASDF就是其中之一。然后通过加载系统加载库。系统也可以被编译、打印

软件包和系统相互独立,不相关


对于每个较大的软件、库或程序,使用一个或多个定制包是有意义的。这避免了名称与其他加载软件的符号冲突。

关于与Python的比较:

包是CL中与Python模块最相似的东西,因为两者都是名称空间。系统和系统工具(如ASDF)更类似于Python中的Distutils和Setuptools

Python模块和CL包之间最重要的区别是:包独立于文件和目录。相反,您可以使用
defpackage
创建包,并使用
use package
将以下代码放入特定的包中。还有其他与包相关的操作符,但它们主要用于交互使用,这两个是源文件中最重要的


请参阅以获取更多详细信息。

如前所述,与其他语言相比:

  • 对应于名称空间
  • 系统对应于模块(即代码集合)
关于软件包:为了避免符号冲突之类的问题,我强烈建议阅读罗恩·加勒特的作品