这是我第一次在 lisp 中使用包。我大致了解了它们在封装数据和代码方面的工作方式。它看起来与其他语言非常相似,我现在还不需要担心差异。
但是,我遇到了一个问题,如果我在我的代码中设置一些东西:
(setf baseNames '(coffee wax blue chili stink green soy blackeyed garden))
稍后会出现:
(print baseNames)
(PIZZABAGEL::COFFEE PIZZABAGEL::WAX PIZZABAGEL::BLUE PIZZABAGEL::CHILI PIZZABAGEL::STINK PIZZABAGEL::GREEN
PIZZABAGEL::SOY PIZZABAGEL::BLACKEYED PIZZABAGEL::GARDEN)
Pizzabagel 是我包裹的名称。这是正常行为吗?假设我想做类似的事情:
(position 'WAX baseNames)
我希望这会返回 1,但由于包名称在任何地方都在前面,所以它返回 nil。我想知道我如何才能 a) 让它不在任何地方都预先设置或 b) 使用它的正常做法是什么?我目前正在编写我自己的位置函数,我希望它能处理这种情况,但在这种情况下必须这样做似乎是错误的方法。预先感谢您提供的任何提示或指示。
最佳答案
您遇到的是一些包混淆问题。
每当您使用阅读器读取一个符号时,该符号会隐式继承当前包的包名。
你可以在这里看到这个演示:
1]> (setf baseNames '(coffee wax blue chili stink green soy blackeyed garden))
(COFFEE WAX BLUE CHILI STINK GREEN SOY BLACKEYED GARDEN)
[2]> (export 'basenames)
T
[3]> (defpackage so (:use cl-user cl))
#<PACKAGE SO>
[4]> (in-package so)
#<PACKAGE SO>
SO[5]> (print basenames)
(COMMON-LISP-USER::COFFEE COMMON-LISP-USER::WAX COMMON-LISP-USER::BLUE
COMMON-LISP-USER::CHILI COMMON-LISP-USER::STINK COMMON-LISP-USER::GREEN
COMMON-LISP-USER::SOY COMMON-LISP-USER::BLACKEYED COMMON-LISP-USER::GARDEN)
(COMMON-LISP-USER::COFFEE COMMON-LISP-USER::WAX COMMON-LISP-USER::BLUE
COMMON-LISP-USER::CHILI COMMON-LISP-USER::STINK COMMON-LISP-USER::GREEN
COMMON-LISP-USER::SOY COMMON-LISP-USER::BLACKEYED COMMON-LISP-USER::GARDEN)
默认情况下,您通常从 CL-USER
包开始,这里就是这种情况。当它是 CL-USER
时,CLISP 不会提示包名(当我们切换到 SO
时,您可以看到它在稍后的提示中添加了 SO
> 包)。
所以,不管怎样,发生的事情是你的包混淆了。
考虑:
SO[6]> (position 'wax basenames)
NIL
失败是因为它在基名中寻找 SO::WAX
(因为我们在 SO
包中),而不是 COMMON-LISP-USER: :蜡
。这是列表中的内容。这就是失败的原因。 (CL-USER
是 COMMON-LISP-USER
的缩写/别名)
关于Lisp 包名称在我不告诉它的情况下自行添加到我的数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23211437/