如何将common-lisp'局部变量传递给maxima?

问题描述 投票:2回答:2

我在maxima中使用SBCL,我想做以下简单的演示,实时绘图,没有暂停/延迟 - :

(loop for j from 1 below 10 do 
          #$plot2d(sin(x),[x,0,?j*%pi])$)

错误:range must be of the form [variable, min, max]; found: [x,0,%pi*j]

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

问题:

  • 如何将common-lisp'局部变量传递给maxima?

提前致谢。

common-lisp maxima
2个回答
1
投票

Maxima仅使用动态范围,而不使用词法范围。 Maxima变量实现为Lisp符号,这些符号被声明为特殊符号。为了使J对Maxima可见,必须以某种方式声明它(通过DEFVAR / DEFPARAMETER或(DECLARE(SPECIAL ...)),我忘记了是否有其他方法)。

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


0
投票

我在起诉这个宏:

(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)")
© www.soinside.com 2019 - 2024. All rights reserved.