gpt4 book ai didi

lisp - 在 Lisp (CLOS) 中访问槽的问题

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

我有一个 Node 类,它有一个“元素”插槽,其中包含一个包含数字和一个字母的列表,例如:

'(1 2 3 b 4 5 6)


(defclass node ()
((element :reader get-element
:writer set-element
:initform '()
:initarg :element
:documentation "The element"))

程序的一部分应该采用“元素”槽,将字母与其中一个数字交换,最后创建一个新的 Node 对象,并将交换后的列表作为其“元素”槽。我已经有一个交换函数,它接收一个列表和该列表的两个成员,并使用 rotatef 函数交换它们。

为了测试交换函数是否正常工作,我创建了以下代码,将元素存储在一个临时变量中,并将字母“b”与列表中的数字交换:


(setf root (make-instance 'node))
(set-element '(1 2 3 b 4 5 6 7 8) root)<p></p>

<p>(setf temp (get-element root))
(swap temp 'b 4)
</p>

问题是根对象的“元素”槽与临时对象一起交换。奇怪的是,我尝试将交换功能更改为反转,但它不会修改两者中的任何一个。

我不知道是否有任何方法可以将槽分配给变量或防止上述情况发生的方法。

谢谢。

最佳答案

一些其他的说明:

  • 不要使用 getter 和 setter 方法,而是使用访问器方法。这通常是首选。

  • 列表是使用 LIST 或 COPY-LIST 等函数创建的。写为 '(1 b 2) 的列表在源代码中是文字常量,不应更改。在 CL 标准中未定义如果您尝试更改文字列表会发生什么。这可能会产生不良影响。如果您有文字列表并且想要修改它,您应该首先使用 COPY-LIST(或 COPY-TREE)复制它并修改该副本。

  • 您还需要了解 REVERSE 等非破坏性操作与 NREVERSE 等可能破坏性操作之间的区别。如果你希望原始列表不变,请使用非破坏性操作。 Common Lisp Hyperspec 中针对每个操作描述了列表或序列操作的性质。

关于lisp - 在 Lisp (CLOS) 中访问槽的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3795895/

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