Я работал над каким-то проектом.Он должен уметь выполнять числовые и символьные вычисления.Но сейчас я застрял на одной проблеме и не знаю, как ее решить.Если говорить точнее, скажем, мы находимся в пакете
(in-package #:brand-new-package)
Где у нас есть база данных символов
(defvar var-symbol-database (make-hash-table :test #'equal))
Функции чтения и настройки
(defun var-symbol (name)
(get-hash name var-symbol-database))
(defun set-var-symbol (name value)
(setf (get-hash name var-symbol-database) value))
(set-var-symbol 'temperature 300) ;K
(set-var-symbol 'f 200) ;Hz
(set-var-symbol 'k 1.3806504e-23) ;J K^-1
и сейчасв другом файле (но в том же пакете) я попытаюсь оценить это уравнение
(eval '(+ 2 (var-symbol 'f)))
Это не сработает.Проблема в том, что по какой-то конкретной причине значение ключа в хеш-таблице равно.
brand-new-package::f
Я думаю, что я решу задачу определения функции следующим образом:
(set-var-symbol 1 '(var-symbol 'f)) ;Hz
Но это интерпретируетсяas
(brand-new-package::var-symbol brand-new-package::f)
Проблема в том, что программа может создавать много разных символов.Он будет вычислять уравнения электронных схем.Программа сначала проверяет объекты устройства, такие как конденсаторы, резисторы и т. Д.Это создает схему табло от MNA.
Во время него может быть создано много новых символов, представляющих напряжения и токи узла.
(v1, v2, v3, i1, i2).
Мне нужен был какой-то метод для хранения количества и имен переменных, представленных в уравнении.Потому что они будут переданы символьному производному, т. Е. (Diff '(* (+ 40 v1) u2 ...)' v1)) Я пришел с идеей, возможно, ошибочной, чтобы сделать их достижимыми по индексу, чтобы определить их как список
'(v 1) '(v 2) '(v 3).
Чтобы сделать их оцениваемыми, я добавил в начало переменную funcall переменной.Итак, список стал
'(var-variable v 1) '(var-variable v 2) '(var-variable v 3)
Но, как я уже писал, система меняет его на
'(brand-new-package::var-variable brand-new-package::v 1) '(brand-new-package::var-variable brand-new-package::v 2) '(brand-new-package::var-variable brand-new-package::v 3)
Как разрешить пользователям доступ к этим переменным, набрав (var-symbol 'v 1),Я могу представить только один способ.Вместо символов используйте строки и функцию экспорта (var-symbol).Тогда это будет работать так
'(var-variable "v" 1)
Но это немного сбивает с толку.