没有包绑定的Lisp符号

时间:2011-04-11 23:28:07

标签: lisp package common-lisp symbols

我一直在做一些项目。它应该能够进行数值和符号计算。但现在我坚持一个问题,我真的不知道如何解决它。具体而简短,假设我们在包中

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

但这有点令人困惑。

2 个答案:

答案 0 :(得分:5)

你正在复制Lisp已经做的事情。符号已经在表中管理,称为包。符号可以有值。将它放入包装是INTERN。找到它是FIND-SYMBOL或只是使用Lisp READer。

如果你想要自己的符号索引表,哈希表就可以了。如果您不想处理这些符号的包,那么只需使用关键字符号即可。他们前面有一个冒号。 :温度就是一个例子。关键字符号在KEYWORD包中自动生成,并且它们自行计算。

答案 1 :(得分:1)

您声明的“问题”与预期一致。 Common Lisp符号brand-new-package::var-symbol表示符号var-symbol位于包brand-new-package中,这是当时由lisp读取符号时的当前包。