如何理解这个 Common Lisp 包的行为?

Posted

技术标签:

【中文标题】如何理解这个 Common Lisp 包的行为?【英文标题】:How to understand this Common Lisp package behavior? 【发布时间】:2021-09-03 11:42:16 【问题描述】:

我是 Common Lisp 的新手。当主题是包和系统时更是如此。我正在使用一个程序,有些东西让我很感兴趣。顺便说一句,我正在使用 SBCL 和 Slime (Emacs)。

作为***(CL-USER)我可以做到:

CL-USER> (application-name/file-name::%function-on-parenscript)

这行得通!然后,我改为inside包:

CL-USER> (in-package :application-name)

好的。所以,我认为 在应用程序名称之后:

APPLICATION-NAME>

我只能这样做:

APPLICATION-NAME> (file-name::%function-on-parenscript)

但是,这不起作用。如果我这样做,它就会起作用:

APPLICATION-NAME> (application-name/file-name::%function-on-parenscript)

1 - 如果我在 application-name 内部,为什么需要 application-name

2 - 为什么有时我需要使用 :: 而有时我只使用 : 来调用?

常见的 Lisp 包用于解决命名空间问题。但它们真的很吸引我。

【问题讨论】:

【参考方案1】:

application-name/file-nameapplication-name 是两个不同的包,它们的名称相似,仅适用于人类读者,但在其他方面无关。

符号要么写有包前缀,要么不写。当有包前缀时,包是冒号或双冒号左边的部分。

双冒号是一种引用未从包中导出的符号的方式(它们是私有的)。

单个冒号表示导出的符号。

如果您要引用的符号在当前包中是“可访问的”,例如因为您正在“使用”它的包并且它被导出,那么您可以编写不带包前缀的符号

详情请见Programming in the Large: Packages and Symbols

【讨论】:

以上是关于如何理解这个 Common Lisp 包的行为?的主要内容,如果未能解决你的问题,请参考以下文章

Common Lisp:在 first、rest、last 中解构列表(如 Python 可迭代解包)

Common lisp——为啥这个符号不是外部的?

如何从 .asd 文件的目录编译和运行 Common Lisp 程序?

Common Lisp宏中的词法绑定

如何在 common-lisp CLOS 中指向一个 defgeneric 实例

为啥 Common Lisp 在没有引号的情况下评估符号本身?