考虑以下案例
(setf mat (list :f1 1 :f2 2))
(getf mat :f1)
按预期输出1
。
我有一个变量(setf str "f1")
或(setf str 'f1)
,无论哪个都有效。
我希望能够做类似
(getf mat :str)
我该怎么做?
答案 0 :(得分:2)
这样做并不是一个好主意,如果你想使用字符串作为键,或者在变量中存储关键字,请考虑使用哈希表。如果您确实需要这样做,可以将字符串转换为关键字,然后查找字段。对于字符串到符号的转换,我们使用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
此外,如果您正在使用他们的代码,则可以使用Alexandria library中的make-keyword。