Lisp 如何访问未知实例';是用一根绳子吗? 问题

Lisp 如何访问未知实例';是用一根绳子吗? 问题,lisp,common-lisp,symbols,slots,clos,Lisp,Common Lisp,Symbols,Slots,Clos,给定一个,inst和一个包含a名称的字符串attr,如何获取inst上插槽attr的值 当然,如果attr是一个符号而不是一个字符串,我通常只会使用(slot value inst attr),但似乎我需要包信息来正确调用intern(见下文) 最小示例 现有技术 从中,我发现我的问题是,intern在不同的包中创建符号,而不是在定义类的包中创建符号 从中可以看出,我无法简单地从实例中提取包信息,因此我必须找到另一种方法(除了使用intern到达那里) 背景 我正在开发一个通用的Lisp端口

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

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

最小示例 现有技术
  • 从中,我发现我的问题是,
    intern
    在不同的包中创建符号,而不是在定义类的包中创建符号
  • 从中可以看出,我无法简单地从实例中提取包信息,因此我必须找到另一种方法(除了使用
    intern
    到达那里)
背景 我正在开发一个通用的Lisp端口 Python的
{}
-格式。要实现Python
操作符(
getattr
),我需要转换 点后面的字符串插入点前面对象上的槽中

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

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

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 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>
CL-USER 127 > (mapcar #'slot-definition-name
                      (class-direct-slots (find-class 'foo)))
(S SYSTEM::S #:S)