Cer*_*dav 2 lisp symbols common-lisp package
我一直在做一些项目.它应该能够进行数值和符号计算.但现在我坚持一个问题,我真的不知道如何解决它.具体而简短,假设我们处于打包状态
(in-package #:brand-new-package)
Run Code Online (Sandbox Code Playgroud)
我们在哪里有符号数据库
(defvar var-symbol-database (make-hash-table :test #'equal))
Run Code Online (Sandbox Code Playgroud)
阅读和设置功能
(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
Run Code Online (Sandbox Code Playgroud)
现在在另一个文件(但相同的包)中,我将尝试评估这个等式
(eval '(+ 2 (var-symbol 'f)))
Run Code Online (Sandbox Code Playgroud)
它不会起作用.问题是由于某些特殊原因,哈希表中键的值是.
brand-new-package::f
Run Code Online (Sandbox Code Playgroud)
我虽然我会解决像这样定义函数的问题
(set-var-symbol 1 '(var-symbol 'f)) ;Hz
Run Code Online (Sandbox Code Playgroud)
但它被解释为
(brand-new-package::var-symbol brand-new-package::f)
Run Code Online (Sandbox Code Playgroud)
问题是程序可以创建许多不同的符号.它将计算电子电路方程.程序首先检查设备对象,如电容器,电阻器等.它由MNA创建电路tablo.
在此期间,可以创建表示节点电压和电流的许多新符号
(v1, v2, v3, i1, i2).
Run Code Online (Sandbox Code Playgroud)
我需要一些方法来保存计算中的变量和变量名称.因为它们将被传递给符号派生者,即(diff'(*(+ 40 v1)u2 ...)'v1))我带来了一个想法,也许是错误的,使它们可以通过索引到达以将它们定义为列表
'(v 1) '(v 2) '(v 3).
Run Code Online (Sandbox Code Playgroud)
为了使它们可评估,我添加了开始var-variable funcall.所以列表成了
'(var-variable v 1) '(var-variable v 2) '(var-variable v 3)
Run Code Online (Sandbox Code Playgroud)
但正如我所写,系统将其更改为
'(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)
Run Code Online (Sandbox Code Playgroud)
如何通过键入(var-symbol'v 1)允许用户访问这些变量.我只能想象一种方式.而不是符号使用字符串和导出函数(var-symbol).然后它将以这种方式工作
'(var-variable "v" 1)
Run Code Online (Sandbox Code Playgroud)
但它有点令人困惑.
你正在重复Lisp已经做的事情.符号已经在表中管理,称为包.符号可以有值.将它放入包装是INTERN.找到它是FIND-SYMBOL或只是使用Lisp READer.
如果你想要自己的符号索引表,哈希表就可以了.如果您不想处理这些符号的包,那么只需使用关键字符号即可.他们前面有一个冒号.:温度就是一个例子.关键字符号在KEYWORD包中自动生成,并且它们自行计算.