Common lisp 如何通过公共lisp';局部变量到最大值?

Common lisp 如何通过公共lisp';局部变量到最大值?,common-lisp,maxima,Common Lisp,Maxima,我正在使用inside,我想进行以下简单演示,以便在不暂停/延迟的情况下进行实时绘图: (loop for j from 1 below 10 do #$plot2d(sin(x),[x,0,?j*%pi])$) 错误:范围的形式必须为[变量、最小值、最大值];找到:[x,0,%pi*j] 我必须使用setf/defvar,但我想使用局部变量 问题: 如何将common lisp的局部变量传递给maxima 提前感谢。Maxima只使用动态范围,不使用词汇范围。Max

我正在使用inside,我想进行以下简单演示,以便在不暂停/延迟的情况下进行实时绘图:

(loop for j from 1 below 10 do 
          #$plot2d(sin(x),[x,0,?j*%pi])$)
错误:
范围的形式必须为[变量、最小值、最大值];找到:[x,0,%pi*j]

我必须使用setf/defvar,但我想使用局部变量

问题:

  • 如何将common lisp的局部变量传递给maxima

提前感谢。

Maxima只使用动态范围,不使用词汇范围。Maxima变量实现为声明为特殊的Lisp符号。为了使J对Maxima可见,它必须以某种方式声明为特殊(通过DEFVAR/DEFPARAMETER或(DECLARE(special…),我忘了是否还有其他方式)

我知道这并不令人满意,因为动态范围使名称冲突成为可能,从而产生微妙的bug。也许您可以通过使用gensym来确保没有名称冲突;可能编写一个宏来替换另一个变量的gensym,并声明gensym特殊,类似这样。

我起诉这个宏:

(defmacro with-maxima (&body body)
  "write normal maxima exprs."
  `(progn
     ,@(mapcar (lambda (slot)
                 (destructuring-bind (&body args) slot
                   `(maxima:displa ,(read-from-string (concatenate 'string
                                                            "#$" (princ-to-string args) "$")))))
               body)
     ,(read-from-string "#$reset()$")
     ,(read-from-string "#$kill(all)$")))
例如:

(with-maxima
  "y3: k-y1-2*y2"
  "gradef(y1,t,v1)"
  "gradef(y2,t,v2)"
  "gradef(v1,t,a1)"
  "gradef(v2,t,a2)"
  "diff(y3,t)")

我猜maxima会查找符号值,这意味着不能使用局部变量。我不知道你所说的“不停顿/延迟”到底是什么意思。即使这样做有效,其效果是否与只运行j:1到9 do plot2d(sin(x),[x,0,j*%pi])的
完全相同在maxima本身?我的意思是没有暂停/延迟,lisp中的一个简单循环将从串行数据中执行一些计算,然后绘制它们,它将等待阻塞-等待新数据,因此不需要暂停。我希望变量在它们之间来回移动,因为我更熟悉lisp的数据类型。我正在考虑使用勾号和逗号,但我担心定制,我认为这是非常常见的用法。我使用字符串作为最大代码,请参阅我的答案。您能为gensym方法提供一些示例代码吗?我的意思是,实际上您需要类似于
(g1234的循环…do(declare(special g1234))(meval(subst'g1234'j myexpr))
的东西,其中
myexpr
是一个通过MREAD-RAW获得的最大表达式(例如类似于
((MPLUS)$X$Y)
)(参见src/npasse.lisp)或者其他方法;我假设您可以创建一个宏来自动化此构造。我觉得这很好。我认为有其他方法可以达到相同的效果,但我看不出您在这里展示的内容有任何错误。您在这个实现中没有得到其他东西吗?您试图解决的更大问题是什么ve?我想在写入时使用代码完成:它不会自动关闭。禁用读取分派宏#$会很好,这样我就可以在不使用读取字符串的情况下使宏正常工作。我想禁用关于y3:作为“”之外的错误。我想为maxima编写相同的代码,但为lisp变量添加一个键。关于“禁用读分派宏#$,这样我就可以使宏在不使用读字符串的情况下工作”:嗯,#$调用MREAD或MREAD-RAW(我忘了是哪个),这样您就可以省略#$,但是您需要自己解析字符串,或者自己构造表达式,例如,
(cons'(mplus)-(1 2 3 4))
。关于“禁用关于y3:作为错误”:我不明白你的意思。关于“为maxima编写相同的代码,但为lisp变量添加一个键”:我不明白你的意思。正如我刚才所说,这将有助于解释你的目标。你正在编写的程序应该做什么?我想在用于机器人控制和动力系统的lisp中使用maxima,所以在lisp中使用控制,在maxima中使用动力系统。我喜欢在一个环境“lisp”中工作。所以“为maxima编写相同的代码,但为lisp变量添加一个键”=代码类似于(使用maxima(y3:1+2+:lisp i)1+2(plot2d(…)):lisp可以是宏将搜索到的任何内容。”将y3:视为错误禁用“=前面的代码有y3:并且lisp将其解释为错误的关键字。好的,听起来像是一个不错的项目。有多种方法可以解释如何合并Maxima和lisp,以及($#+特殊变量)的方式似乎是可行的,而且并不明显比其他方法差。我所知道的避免通过某种方式解析字符串的唯一方法是构造与Maxima表达式相对应的Lisp表达式(
(cons'(mplus)-(1 2 3 4))
)。顺便说一句,如果您有需要讨论的问题,您可能应该在maxima discussion邮件列表上提问。请参阅: