没有包绑定的Lisp符号

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)

但它有点令人困惑.

Rai*_*wig 5

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

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