我需要定义一个名称包含在另一个变量中的变量。
以下代码不起作用,它使用eval
,因此风格不是很好。
(defvar symbol "zap")
(eval `(defvar ,symbol 100))
(print zap)
答案 0 :(得分:1)
首先 - 你确定你需要这样做吗?
现在,随着那个 -
(defvar *symbol-name* "zap")
(let ((symbol (intern *symbol-name*)))
(proclaim `(special ,symbol))
(setf (symbol-value symbol) 100))
(print |zap|)
请注意,|zap|
通常需要引用管道,因为intern
区分大小写,而默认的readtable默认情况下会更新符号。因此,如果您没有引用(print zap)
,则会将其解释为(PRINT ZAP)
,但zap
的错误情况。或者,您可以使用(intern (string-upcase *symbol-name*))
来填充实习符号。
在看到您实际尝试的内容后进行更新。
您绝对不希望为此定义全局变量。将键(A1 ... H4等)映射到数字的数据结构是您想要的。在这种情况下,您的键可以是符号或字符串。数据结构可以是哈希表,plist或alist(以及其他选项)。例如,字符串键控哈希表看起来像:
(defvar *table* (make-hash-table :test #'equalp))
(setf (gethash "A1" *table*) 42)
(print (gethash "A1" *table*)) ==> prints 42
答案 1 :(得分:1)
通常最好为此目的使用哈希表。
答案 2 :(得分:0)
如果您绝对想要使用全局变量,我怀疑SET和SYMBOL-VALUE(并使用符号而不是字符串)可能会有效。它肯定属于“嗯,是的,你可以这样做,但我不相信它是最好的方式”领域。
但是,最好使用哈希表或(完全跳过存储,如果不需要改变A1意味着更远的线路),这个函数可以解析字母和数字,并计算相关的值。
答案 3 :(得分:0)
使用 SET :
CL-USER 13 > (defvar *some-symbol* '*this-is-some-symbol*)
*SOME-SYMBOL*
CL-USER 14 > (set *some-symbol* 42)
42
CL-USER 15 > *this-is-some-symbol*
42
或如果是字符串:
(setf (symbol-value (find-symbol some-symbol-name)) 42)