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
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
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. –