2010-11-08 137 views

回答

1

首先 - 你确定你需要这样做吗?

现在,有了这样的方式 -

(defvar *symbol-name* "zap") 
(let ((symbol (intern *symbol-name*))) 
    (proclaim `(special ,symbol)) 
    (setf (symbol-value symbol) 100)) 
(print |zap|) 

注意|zap|通常需要用水管被引用,因为intern是区分大小写的,而默认readtable upcases符号默认。因此,如果您不引用,如(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 
+0

非常感谢你,丹尼尔。我试图达到的目标是使用名称为“A1”..“H8”的64个变量,其中包含值21..98。 A1 = 21,...,H1 = 28,A2 = 31,...,H2 = 38,...,H8 = 98。所以我从(dolist(c'(a b c d e f g h i j))(dolist(r'(1 2 3 4 5 6 7 8))(defvar ...)))开始。这项任务有更好的方法吗? – Patrick 2010-11-08 16:23:16

+0

是的,你绝对不希望为此定义一堆全局变量(想象一下,如果你在程序中的某个点使用了一个名为H1的变量,会发生什么)。查看更新后的答案。 – 2010-11-08 17:07:40

1

为此目的使用散列表通常会更好。

0

如果你绝对想用全局变量来做到这一点,我怀疑SET和SYMBOL-VALUE(以及使用符号而不是字符串)可能会有诀窍。它绝对属于“嗯,是的,你可以这样做,但我不相信这是最好的方式”的领土,但。

然而,使用散列表或者(完全跳过存储空间,如果没有必要改变A1意味着更深入的行),您最好的办法是将字母和数字分开并计算相关价值。

+0

我认为这是有用的原因是:A1..H8是一个数组的入口。由于应用程序(棋盘)产生的原因,此数组必须使用索引0..119。我认为能够说方便(setf(aref board a1)'king)等等。但是我也看到,全局命名空间可能不是字段名称的正确位置。谢谢。 – Patrick 2010-11-09 16:16:45

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) 
+0

我怎么能忘记,不仅有一个“quoted set”(setq),而且还有通用的“set”指令。有时候我怀疑我的想法很复杂。谢谢,Rainer! – Patrick 2010-11-09 16:23:30

相关问题