Символы Lisp без привязок к пакету - PullRequest
2 голосов
/ 12 апреля 2011

Я работал над каким-то проектом.Он должен уметь выполнять числовые и символьные вычисления.Но сейчас я застрял на одной проблеме и не знаю, как ее решить.Если говорить точнее, скажем, мы находимся в пакете

(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)

Но это немного сбивает с толку.

Ответы [ 2 ]

5 голосов
/ 12 апреля 2011

Вы дублируете то, что уже делает Lisp.Символы уже управляются в таблицах, называемых пакетами.Символ может иметь значение.Положить его в пакет - это ВНУТРЕННИЙ.Чтобы найти его, найдите FIND-SYMBOL или просто используйте Lisp READer.

Если вам нужны ваши собственные таблицы индексов символов, то подойдет хеш-таблица.Если вы не хотите иметь дело с пакетами этих символов, просто используйте ключевые слова.У них есть единственная двоеточие впереди.: температура была бы примером.Символы ключевых слов автоматически находятся в пакете KEYWORD и они оценивают сами себя.

1 голос
/ 12 апреля 2011

То, что вы считаете «проблемой», соответствует ожиданиям. Обозначение Common Lisp brand-new-package::var-symbol означает, что символ var-symbol находится в пакете brand-new-package, который был текущим пакетом ввремя, когда символ был прочитан языком.

...