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

问题描述

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

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

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

这有效!然后,我更改为在包内

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

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

APPLICATION-NAME>

我可以做到:

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

然而,这不起作用。如果我这样做,它就有效:

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

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

2 - 为什么有时我需要使用 :: 而其他时候我只使用 :调用事物?

Common Lisp 包用于解决命名空间问题。但它们真的让我很感兴趣。

解决方法

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

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

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

单个冒号用于导出的符号。

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

详情见Programming in the Large: Packages and Symbols