Как связать атрибут списка свойств со строкой
Рассмотрим следующий случай
(setf mat (list :f1 1 :f2 2))
(getf mat :f1)
выходы 1
как и ожидалось.
У меня есть переменная (setf str "f1")
или же (setf str 'f1)
какой бы ни работал. И я хочу быть в состоянии сделать что-то вроде
(getf mat :str)
Как я могу это сделать?
1 ответ
Решение
Это не очень хорошая идея, подумайте об использовании хеш-таблицы, если вы хотите использовать строки в качестве ключей, или сохраните ключевое слово в своей переменной. Если вам действительно нужно это сделать, вы можете преобразовать свою строку в ключевое слово, а затем найти поле. Для преобразования строки в символ мы используем intern
, чтобы сделать это ключевое слово, просто интернировать его в :KEYWORD
пакет.
(defparameter *data* (list :f1 1 :f2 2))
;;; Case of string IS important
;;; (intern "f1" :keyword) => :|f1|
;;; (intern "F1" :keyword) => :F1
(getf *data* (intern "F1" :keyword))
;;; => 1
Кроме того, вы можете использовать make-ключевое слово из библиотеки Александрии, если вы используете их код.