gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:55 25 4
gpt4 key购买 nike

这是我第一次在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com