我在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,但我想使用局部变量。
问题:
提前致谢。
Maxima仅使用动态范围,而不使用词法范围。 Maxima变量实现为Lisp符号,这些符号被声明为特殊符号。为了使J对Maxima可见,必须以某种方式声明它(通过DEFVAR / DEFPARAMETER或(DECLARE(SPECIAL ...)),我忘记了是否有其他方法)。
我知道这并不令人满意,因为动态范围可能会产生名称冲突,从而产生微妙的错误。也许你可以通过使用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)")