这是我第一次在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
比萨饼::大豆比萨饼::黑眼比萨饼::花园)
比萨饼是我包裹的名字这是正常的行为吗假设我想做如下事情:
(position 'WAX baseNames)
我希望这将返回1,但是由于包名称在任何地方都在其前面,因此它返回nil我想知道我怎样才能a)使它不在任何地方都预先准备好,或者b)处理这个问题的常规做法是什么?我目前正在编写自己的position函数,我希望它能处理这种情况,但在这种情况下,必须这样做似乎是错误的做法提前感谢您提供的任何提示或指示。
最佳答案
你要找的是一些包裹混乱。
每当使用读取器读取符号时,该符号将隐式继承当前包的包名称。
你可以在这里看到这一点:
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
包开始,这里就是这种情况CLISP在CL-USER
时不会提示包名(稍后切换到SO
包时,您可以看到它将SO
添加到提示中)。所以,不管怎样,发生的事是你把你的包裹弄糊涂了。
考虑:
SO[6]> (position 'wax basenames)
NIL
这失败是因为它在基名中查找
SO::WAX
(因为我们在SO
包中),而不是COMMON-LISP-USER::WAX
这就是名单上的内容这就是失败的原因(CL-USER
是COMMON-LISP-USER
的缩写/别名)关于lisp - Lisp程序包名称自动添加到我的数据中,而无需我告诉它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23211437/