Как связать атрибут списка свойств со строкой

Рассмотрим следующий случай

(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-ключевое слово из библиотеки Александрии, если вы используете их код.

Другие вопросы по тегам