gpt4 book ai didi

lisp - CLOS 插槽访问器 : read but not write

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

我有一个 CLOS 对象的插槽名称列表:

(DEFCLASS TRIAL-DATA (STANDARD-OBJECT) 
((A-DATUM :ACCESSOR A-DATUM :INITARG :A-DATUM :INITFORM NIL)
(BOTH-DATA :ACCESSOR BOTH-DATA :INITARG :BOTH-DATA :INITFORM 0)
(CUMULATIVE-DATA :ACCESSOR CUMULATIVE-DATA :INITARG :CUMULATIVE-DATA :INITFORM NIL)
(NAME :ACCESSOR NAME :INITARG :NAME :INITFORM VALUE)))

(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of td)))))

我可以读取这些插槽的值:

(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of td)))))
(funcall (symbol-function (nth 0 slot-lst)) td))

==> 无

但为什么我不能向这些插槽写入新值?我的 trial-data 类定义不应该为每个槽创建一个访问器函数吗?

;; Should set the first slot, a-datum's, value to 42
(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of td)))))
(setf (funcall (symbol-function (nth 0 slot-lst)) td) 42))

==>

;Compiler warnings for "/Users/frank/Documents/NRL/Error/Patrolbot/Patrol Construction Notes & Testing.lisp" :
; In an anonymous lambda form at position 123: Undefined function (SETF FUNCALL)
> Error: Undefined function (SETF FUNCALL) called with arguments (42 #<STANDARD-GENERIC-FUNCTION A-DATUM #x302001D1C5DF> #<TRIAL-DATA #x30200200D95D>) .
> While executing: #<Anonymous Function #x30200200EB7F>, in process Listener-2(5).

最佳答案

访问器称为a-datum

读者:

CL-USER 9 > #'a-datum
#<STANDARD-GENERIC-FUNCTION A-DATUM 406000091C>

作者:

CL-USER 10 > #'(setf a-datum)
#<STANDARD-GENERIC-FUNCTION (SETF A-DATUM) 422000958C>

如果要通过funcall调用编写器,需要调用上面的函数。

如果你有一个普通的形式 (setf (a-datum foo) 'bar)) 那么这需要在宏扩展时解决。

错误消息说 #'(setf funcall) 未定义。因此 (setf (funcall ...) ...) 不存在。

在您的案例中,您如何获得 writer 函数?

CL-USER 11 > (fdefinition '(setf a-datum))
#<STANDARD-GENERIC-FUNCTION (SETF A-DATUM) 422000958C>

CL-USER 12 > (let ((name 'a-datum)) (fdefinition `(setf ,name)))
#<STANDARD-GENERIC-FUNCTION (SETF A-DATUM) 422000958C>

你的任务:上述函数的正确参数是什么?

关于lisp - CLOS 插槽访问器 : read but not write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24335054/

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