gpt4 book ai didi

lisp - 如何使用字符串访问未知实例的插槽?

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

问题

给定一个 instance , inst 和一个包含 slot 名称的字符串 attr ,如何获取 inst 上的插槽 attr 的值?

当然,如果 attr 是一个符号而不是字符串,我通常只使用 (slot-value inst attr),但看来我需要这个包正确调用 intern 的信息(见下文)。

最小示例

(defpackage :pack1
(:use :common-lisp)
(:export :*inst*))

(in-package :pack1)

(defclass temp-class ()
((temp-slot :initarg :temp-slot)))

(defvar *inst* (make-instance 'temp-class :temp-slot "value"))

(defpackage :pack2
(:use :common-lisp :pack1)
(:import-from :pack1 :temp-class))

(in-package :pack2)

(let ((inst *inst*) ; In the real example, inst gets defined outside my control,
; in yet another package
(attr "temp-slot"))
(format t "Given package name: ~S; " ; prints fine
(slot-value inst (intern (string-upcase attr) :pack1)))
(format t "No package name: ~S; " ; signals an error
(slot-value inst (intern (string-upcase attr)))))

现有技术

  • 来自 this question ,我发现我的问题是 intern 在与定义类的包不同的包中创建符号。
  • 似乎来自this question , 我不能简单地从实例中提取包信息,所以我必须想出另一种方法(除了使用 intern 到达那里)

背景

我正在研究 py-format Common Lisp端口Python 的 {} 格式。要实现 Python . 运算符 (getattr),我需要将点后的字符串放入点前对象的槽中。

最佳答案

Given an instance, inst and a string attr containing the name of a slot, how can I obtain the value of the slot attr on inst?

插槽没有字符串作为插槽名称,而是符号。由于插槽名称可以是任意符号,如果您只有一个字符串,则没有通用的方法来获取插槽值。

CL-USER 124 > (defclass foo ()
((s) ; the slot-name is cl-user::s
(system::s) ; the slot-name is system::s
(#:s))) ; the slot-name is #:s
#<STANDARD-CLASS FOO 413054236B>

最后一个槽名是一个未实习的符号。它没有包装。因此,如果您没有将它存储在某个地方,您将无法以任何方式查找它。

CL-USER 125 > (make-instance 'foo)
#<FOO 402013F043>

CL-USER 126 > (describe *)

#<FOO 402013F043> is a FOO
S #<unbound slot>
S #<unbound slot>
S #<unbound slot>

如您所见,它具有三个插槽。每个符号都有名称 s,但实际上是不同的符号。

您可以通过内省(introspection)获取插槽名称:

CL-USER 127 > (mapcar #'slot-definition-name
(class-direct-slots (find-class 'foo)))
(S SYSTEM::S #:S)

有关便携功能,请参阅 CLOSER-MOP .

关于lisp - 如何使用字符串访问未知实例的插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245105/

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