使用保存在其他变量中的名称定义变量

时间:2010-11-08 15:44:57

标签: common-lisp

我需要定义一个名称包含在另一个变量中的变量。

以下代码不起作用,它使用eval,因此风格不是很好。

(defvar symbol "zap")
(eval `(defvar ,symbol 100))
(print zap)

4 个答案:

答案 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)