gpt4 book ai didi

lisp - 如何使用任意数量的参数在 lisp 中定义结构?

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

我正在尝试定义一个结构,其中包含一些我知道我想要的属性,以及任意数量的基本结构不需要的其他属性。

(defstruct (node (:type list)) label [other args here])

我知道在一个函数中你可以做:

(defun foo (arg1 &rest args) ...)

是否有某种 &rest 等同于 defstruct

我刚刚开始学习 lisp,所以我觉得我缺少了一些东西。如果没有 &rest 等价物,我有什么想法可以解决这个问题吗?提前致谢!

最佳答案

在 Common Lisp 中,结构被认为是严格的低级记录。它们没有花哨的动态特征。

你可以用结构做的是定义一个新的结构类型,它继承自另一个结构类型。有可用的单一继承。

要处理动态可扩展性,典型的方法是将属性列表槽添加到结构中。参见 Joshua 的回答。

然后是 Common Lisp 对象系统,它提供了多重继承,你可以在运行时更改类。因此,您可以向一个类添加一个插槽,该类的实例会自行更新。您还可以更改对象的类,并且可能会添加或删除插槽。尽管如此,通常一个类的所有实例都将具有相同的一组插槽。同样,可以看到带有属性列表的插槽可以添加并用于可扩展性。

Common Lisp 还有其他对象系统,可以轻松地在每个实例基础上添加插槽。但仅仅为此使用它们通常是太多了,因为它们要强大得多。

借助 CLOS 和元对象协议(protocol),可以尝试隐藏它。我在这里使用 LispWorks:

我们为我们的属性定义一个混合类:

(defclass property-mixin ()
((plist :initform nil))
#+lispworks
(:optimize-slot-access nil))

设置和读取属性:

(defmethod set-property ((object property-mixin) key value)
(setf (getf (slot-value object 'plist) key) value))

(defmethod get-property ((object property-mixin) key)
(getf (slot-value object 'plist) key))

现在我们编写方法使 SLOT-VALUE 接受我们的属性名称:

(defmethod (setf clos:slot-value-using-class)
(value (class standard-class) (object property-mixin) slot-name)
(declare (ignorable class))
(if (slot-exists-p object slot-name)
(call-next-method)
(progn
(set-property object slot-name value)
value)))

(defmethod clos:slot-value-using-class ((class standard-class)
(object property-mixin)
slot-name)
(declare (ignorable class))
(if (slot-exists-p object slot-name)
(call-next-method)
(get-property object slot-name)))

例子。我们定义了一个带有两个插槽的汽车类:

(defclass automobile (property-mixin)
((company :initarg :company)
(motor :initarg :motor))
#+lispworks
(:optimize-slot-access nil))

现在是一个实例:

CL-USER 45 > (setf a6 (make-instance 'automobile :company :audi :motor :v6))
#<AUTOMOBILE 402005B47B>

我们可以得到一个正常的槽值:

CL-USER 46 > (slot-value c1 'motor)
:V6

让我们写入一个不存在但将添加到我们的属性列表中的插槽:

CL-USER 47 > (setf (slot-value a6 'seats) 4)
4

我们可以取回值:

CL-USER 48 > (slot-value c1 'seats)
4

关于lisp - 如何使用任意数量的参数在 lisp 中定义结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17554370/

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