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

Common lisp 使用保存在其他变量中的名称定义变量,common-lisp,Common Lisp,我需要用另一个变量中包含的名称定义一个变量 下面的代码不起作用,它使用了eval,因此不是很好的样式 (defvar symbol "zap") (eval `(defvar ,symbol 100)) (print zap) 首先,你确定你需要这样做吗 现在,让这件事过去-- 请注意,|zap |通常需要与管道一起引用,因为intern区分大小写,而默认的可读表在默认情况下是大写符号。因此,如果您不引用,如在(print zap)中,这将被解释为(print zap),而zap的大小写是错误

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

下面的代码不起作用,它使用了
eval
,因此不是很好的样式

(defvar symbol "zap")
(eval `(defvar ,symbol 100))
(print zap)
首先,你确定你需要这样做吗

现在,让这件事过去--

请注意,
|zap |
通常需要与管道一起引用,因为
intern
区分大小写,而默认的可读表在默认情况下是大写符号。因此,如果您不引用,如在
(print zap)
中,这将被解释为
(print zap)
,而
zap的大小写是错误的。或者,您可以使用
(intern(字符串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

通常使用哈希表更好。

如果您确实想这样做,使用全局变量,我怀疑SET和SYMBOL-VALUE(使用符号代替字符串)可能会奏效。不过,这肯定属于“嗯,是的,你可以这样做,但我不相信这是最好的方式”的范畴


但是,您最好使用哈希表或(如果不需要修改A1的含义,则完全跳过存储)一个将字母和数字分开分析并计算相关值的函数。

使用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)

非常感谢你,丹尼尔。我试图实现的是有64个名为“A1”。“H8”的变量,其中包含值21..98。A1=21,…,H1=28,A2=31,…,H2=38,…,H8=98。所以我从(dolist(c’(abcdefgij))(dolist(r’(12345678))(defvar…)开始。这项任务有更好的解决方案吗?是的,你肯定不想为此定义一堆全局变量(想象一下,如果你在程序中的某个点实际使用一个名为H1的变量,会发生什么情况)。查看更新后的答案。我认为这很有用的原因是:A1..H8是一个数组中的整数。由于应用程序(棋盘)的原因,此数组必须使用索引0..119。我认为可以说(setf(aref board a1)‘国王’之类的话很方便。但我也看到,全局名称空间可能不是字段名的正确位置。谢谢。我怎么会忘记,不仅有“引用集”(setq),还有通用的“集合”指令。有时,我怀疑我的想法太少,太复杂了。谢谢你,雷纳!
(setf (symbol-value (find-symbol some-symbol-name)) 42)