2010-11-08 5 views

Répondre

1

Tout d'abord, êtes-vous sûr de vouloir faire cela?

Maintenant, avec cela de la route -

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

Notez que |zap| aura normalement besoin d'être cité avec des tuyaux, car intern est sensible à la casse, tandis que les symboles par défaut readtable de upcases par défaut. Donc, si vous ne citez pas, comme dans (print zap), cela est interprété comme (PRINT ZAP), avec le mauvais cas pour zap. Alternativement, vous pouvez mettre à jour le symbole interné, avec (intern (string-upcase *symbol-name*)).


Mettez à jour après avoir vu ce que vous essayez réellement de faire.

Vous ne voulez certainement pas définir des variables globales pour cela. Une structure de données qui mappe les clés (A1 ... H4, etc.) aux nombres est ce que vous voulez. Dans ce cas, vos clés peuvent être des symboles ou des chaînes. Et la structure de données pourrait être une hashtable, une plist ou une alist (parmi d'autres choix). Par exemple, une table de hachage avec des chaînes de caractères aurait l'aspect suivant:

(defvar *table* (make-hash-table :test #'equalp)) 
(setf (gethash "A1" *table*) 42) 
(print (gethash "A1" *table*)) ==> prints 42 
+0

Merci beaucoup, Daniel. Ce que j'essaie de faire est d'avoir 64 variables avec les noms "A1" .. "H8", qui contiennent les valeurs 21..98. A1 = 21, ..., H1 = 28, A2 = 31, .., H2 = 38, .... H8 = 98. J'ai donc commencé par (dolist (c '(a b c d e f g h i j)) (dolist (r' (1 2 3 4 5 6 7 8)) (defvar ...))). Y a-t-il une meilleure approche pour cette tâche? – Patrick

+0

Oui, vous ne voulez certainement pas définir un tas de variables globales pour cela (imaginez ce qui se passerait si vous utilisiez une variable appelée H1 à un moment donné dans le programme). Consultez la réponse mise à jour. –

1

Il est généralement préférable d'utiliser une table de hachage à cette fin.

0

Si vous voulez absolument faire cela, avec des variables globales, je suppose que SET et SYMBOL-VALUE (et en utilisant des symboles au lieu de chaînes) pourraient faire l'affaire. Il tombe définitivement dans le «hm, oui, vous pouvez le faire de cette façon, mais je ne suis pas convaincu que c'est le meilleur moyen» du territoire, cependant. Cependant, il vaut probablement mieux utiliser une table de hachage ou (ignorer complètement le stockage, s'il n'y a pas besoin de muter ce que A1 signifie plus loin sur la ligne) une fonction qui analyse la lettre et le chiffre et calcule le valeur pertinente.

+0

la raison pour laquelle j'ai considéré que cela est utile est: Les A1..H8 sont des inices dans un tableau. Ce tableau doit fonctionner avec les indices 0..119 pour des raisons qui découlent de l'application (échiquier). J'ai trouvé ça pratique de pouvoir dire (setf (aref board a1) 'king) et ainsi de suite. Mais je vois aussi que l'espace de noms global pourrait ne pas être le bon endroit pour les noms de champs. Je vous remercie. – Patrick

0

utilisation 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 

ou si elle est une chaîne:

(setf (symbol-value (find-symbol some-symbol-name)) 42) 
+0

comment pourrais-je oublier qu'il y a non seulement un "ensemble quoted" (setq) mais aussi l'instruction "set" générique. Je pense que je pense peu à compliqué, parfois. Merci, Rainer! – Patrick

Questions connexes