Проблема
Дано instance, inst
и строку, содержащую attr
имя slot, как я могу получить значение слота attr
на inst
?Как получить доступ к слоту неизвестного экземпляра с помощью строки?
Конечно, если 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
a Общий Lisp-порт Python's {}
-formatting. Чтобы реализовать оператор Python .
(getattr
) Мне нужно преобразовать строку после точки в слот объекта, предшествующего точке.
Спасибо - последний бит с интроспекцией поможет мне переосмыслить синтаксис – Felipe