我一直在做一些项目。它应该能够进行数值和符号计算。但现在我坚持一个问题,我真的不知道如何解决它。具体而简短,假设我们在包中
(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
但它被解释为
(brand-new-package::var-symbol brand-new-package::f)
问题是程序可以创建许多不同的符号。它将计算电子电路方程。程序首先检查设备对象,如电容器,电阻器等。它由MNA创建电路tablo。
在此期间,可以创建许多代表节点电压和电流的新符号
(v1, v2, v3, i1, i2).
我需要一些方法来保存方程中的变量和变量名称。因为它们将传递给符号派生者,即(diff'(*(+ 40 v1)u2 ...)'v1))我带来了一个想法,也许是错误的,可以通过索引将它们定义为将它们定义为列表< / p>
'(v 1) '(v 2) '(v 3).
为了使它们可评估,我添加了开始var-variable 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)
但这有点令人困惑。
答案 0 :(得分:5)
你正在复制Lisp已经做的事情。符号已经在表中管理,称为包。符号可以有值。将它放入包装是INTERN。找到它是FIND-SYMBOL或只是使用Lisp READer。
如果你想要自己的符号索引表,哈希表就可以了。如果您不想处理这些符号的包,那么只需使用关键字符号即可。他们前面有一个冒号。 :温度就是一个例子。关键字符号在KEYWORD包中自动生成,并且它们自行计算。
答案 1 :(得分:1)
您声明的“问题”与预期一致。 Common Lisp符号brand-new-package::var-symbol
表示符号var-symbol
位于包brand-new-package
中,这是当时由lisp读取符号时的当前包。