gpt4 book ai didi

object - 是否有克隆 CLOS 对象的通用方法?

转载 作者:行者123 更新时间:2023-12-04 10:01:23 24 4
gpt4 key购买 nike

我正在寻找一种以浅层方式克隆 CLOS 对象的方法,因此创建的对象将具有相同的类型,在每个插槽中具有相同的值,但是是一个新实例。我发现的最接近的是一个标准函数复制结构,它对结构执行此操作。

最佳答案

一般没有标准的预定义方法来复制 CLOS 对象。如果可能的话,提供一个合理的默认复制操作(至少)在大多数时间为任意对象做正确的事情并非易事,因为正确的语义从类到类以及从应用程序到应用程序都会发生变化。 MOP 提供的扩展可能性使得提供这样的默认值变得更加困难。此外,在 CL 中,作为一种垃圾收集语言,并不经常需要复制对象,例如当作为参数传递或被返回时。因此,根据需要实现复制操作可能是最干净的解决方案。

话虽如此,这是我在我的一个片段文件中找到的内容,它可能会满足您的需求:

(defun shallow-copy-object (original)
(let* ((class (class-of original))
(copy (allocate-instance class)))
(dolist (slot (mapcar #'slot-definition-name (class-slots class)))
(when (slot-boundp original slot)
(setf (slot-value copy slot)
(slot-value original slot))))
copy))

您将需要一些 MOP 支持 class-slotsslot-definition-name .

(我可能从 an old c.l.l thread 中采用了这个,但我不记得了。我从来没有真正需要这样的东西,所以它完全未经测试。)

您可以像这样使用它(使用 CCL 测试):
CL-USER> (defclass foo ()
((x :accessor x :initarg :x)
(y :accessor y :initarg :y)))
#<STANDARD-CLASS FOO>
CL-USER> (defmethod print-object ((obj foo) stream)
(print-unreadable-object (obj stream :identity t :type t)
(format stream ":x ~a :y ~a" (x obj) (y obj))))
#<STANDARD-METHOD PRINT-OBJECT (FOO T)>
CL-USER> (defparameter *f* (make-instance 'foo :x 1 :y 2))
*F*
CL-USER> *f*
#<FOO :x 1 :y 2 #xC7E5156>
CL-USER> (shallow-copy-object *f*)
#<FOO :x 1 :y 2 #xC850306>

关于object - 是否有克隆 CLOS 对象的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067899/

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