Lisp 包名称在我不告诉它的情况下自行添加到我的数据中

标签 lisp

这是我第一次在 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-USERCOMMON-LISP-USER 的缩写/别名)

关于Lisp 包名称在我不告诉它的情况下自行添加到我的数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23211437/

相关文章:

list - 用列表中的单词替换数字

parameters - LISP 参数绑定(bind)

recursion - CLISP dfs 获取程序堆栈溢出

performance - JVM 上性能最高的 lisp 是什么

lisp - 元素未添加到列表

data-structures - Common Lisp 的优先级队列?

clojure - 我可以不使用 eval 来编写这个宏吗?

tree - 查找树中最深的节点 (Lisp)

list - lisp 从列表中过滤掉不匹配谓词的结果

macros - 口齿不清/克洛朱尔 : Is it a good idea to write function generating macros?