小编Cer*_*dav的帖子

没有包绑定的Lisp符号

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

(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) …
Run Code Online (Sandbox Code Playgroud)

lisp symbols common-lisp package

2
推荐指数
1
解决办法
387
查看次数

LISP中浮点的神秘问题 - 时间轴生成

好的,我知道什么以及如何工作浮点.但是,每当我处理它时,它都不会让我感到困惑.

我尝试做一些时间轴生成功能.这个想法很简单.要像这样做smt

(defun make-time-axis (start step stop)
  ...)
Run Code Online (Sandbox Code Playgroud)

所以,当你用例如

(make-time-axis 0 0.1 1.2)
Run Code Online (Sandbox Code Playgroud)

结果将是

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 
Run Code Online (Sandbox Code Playgroud)

但每当我做任何事情

(loop for i from 0.0 below 1.2 by 0.1 collect i)
Run Code Online (Sandbox Code Playgroud)

要么

(defun make-time-axis (last step stop)
  (cond  ((< last stop ) (cons last (make-time-axis (+ last step) step stop )))
     (t nil)))
Run Code Online (Sandbox Code Playgroud)

等等

我得到了这些结果

(0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.70000005 0.8000001 0.9000001 1.0000001 1.1000001)
Run Code Online (Sandbox Code Playgroud)

anybode能给我一些线索如何得到我想要的东西吗?

lisp floating-point

2
推荐指数
1
解决办法
234
查看次数


标签 统计

lisp ×3

floating-point ×2

common-lisp ×1

math ×1

package ×1

precision ×1

symbols ×1