gpt4 book ai didi

lisp - Lisp 中的实例变量?

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:52 28 4
gpt4 key购买 nike

我正在为 CLOS 类编写一个函数,该函数反转所述类对象的列表元素。

我有一个返回反向列表的方法,但如何让它将对象的列表设置为该列表?我可以在存储列表的函数中有一个实例变量,然后将元素设置为那个吗?或者有更简单的方法吗?

这是现在的方法:

(defun my-reverse (lst)
(cond ((null lst) ‘())
(t (append (my-reverse (cdr lst)) (car lst)))))

它传递的对象是 (l my-list),然后访问器将是 (my-list-ls l)。

编辑:意识到 cons 不适用于 2 个列表。

Edit2:我假设正确的代码是:

(defun my-reverse (l my-list)
(cond ((null (my-list-ls l) ‘())
(t (setf (my-list-ls l) (append (my-reverse (cdr (my-list-ls l)))
(car (my-list-ls l)))))))

最佳答案

如果您想修改一个对象的槽,您需要将该对象本身传递给您的函数,而不仅仅是您要更改的槽的值。

编辑:关于问题的编辑

我假设 my-list 是类的名称,您实际上并不想将它传递给函数,对吧?在这种情况下,您应该将 defun 替换为 defmethod。此外,最好只更改一次实例,在您反转整个列表之后,而不是在每一步都更改。您可以为此使用一个内部函数:

(defmethod my-reverse ((l my-list))
(labels ((inner (list acc)
(if (endp list)
acc
(inner (rest list) (cons (first list) acc)))))
(setf (my-list-ls l) (inner (my-list-ls l) ()))))

编辑 2:详细说明

defmethoddefun 的替代方法,用于定义(多态)方法。不过,如果您不需要多态性,您可以只在第一行使用 (defun my-reverse (l)

labels 用于内部函数定义。在这里,它定义了一个名为 inner 的内部函数,带有两个参数 listaccinner 是执行实际反转的函数,它是一个尾递归函数,因为反转自然地与尾递归一起进行。 (它可以使用 cons 构建其结果,因此具有线性复杂性,而您的解决方案需要 append 并且因此具有二次复杂性,因为 cons本身是常量,但是 append 是线性的。)

firstrest 只是 carcdr 的别名,endp 主要只是 null 的替代名称,不同之处在于 endp 如果其参数实际上不是列表,则将发出错误信号。

最后,最后一行以原始列表和空列表作为参数调用 inner,并将结果分配给插槽(也称为实例变量)。

关于lisp - Lisp 中的实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8337008/

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