Под «искусственным» подразумевается один, созданный из строки с использованием intern
или make-symbol
.
У меня есть часть моего кода, объявляющий до 49 глобальных переменных:Объявить глобальную переменную с помощью «искусственного» символа
(defparameter *CHAR-COUNT-1-1* (make-hash-table))
...
(defparameter *CHAR-COUNT-1-7* (make-hash-table))
...
(defparameter *CHAR-COUNT-7-7* (make-hash-table))
я думал, вместо этого, я мог бы создать функцию, чтобы сделать все, что:
(loop for n from 1 to 7 do
(loop for i from 1 to 7 do
(defparameter (symbol-value (intern (concatenate 'string "*CHAR-COUNT-" (write-to-string n) "-" (write-to-string i) "*")))
(make-hash-table :test 'equalp))))
Но получаю ошибку (sbcl):
unhandled SIMPLE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
{1002978EE3}>:
Can't declare a non-symbol as SPECIAL: (SYMBOL-VALUE
(INTERN
(CONCATENATE 'STRING "*CHAR-COUNT-"
(WRITE-TO-STRING N) "-"
(WRITE-TO-STRING I)
"*")))
Каков правильный способ для этого?
Встраивание размерный данные в имя переменной кажется, что это действительно должно быть различные данные структуры, как двухмерный массив. Но если вы действительно хотите это сделать, один простой способ - через макролет. – Xach
Снимите SYMBOL-VALUE для запуска; вы не хотите значения символа ... вам также понадобится либо макроэкземпляр DEFPARAMETER. – BRFennPocock