我正在maxima内使用SBCL,并且我想进行以下简单的演示以进行实时绘图而不会暂停/延迟:
<item android:state_pressed="true">
<shape>
<solid android:color="@color/materialBlueGray600" />
<corners android:radius="3dp" />
</shape>
</item>
<item android:state_selected="true">
<shape>
<solid android:color="@color/materialGray50" />
<corners android:radius="3dp" />
</shape>
</item>
<item>
<layer-list>
<item>
<shape>
<solid android:color="@color/materialGray50" />
<corners android:radius="3dp" />
</shape>
</item>
<item android:gravity="right">
<bitmap android:antialias="true" android:gravity="right" android:src="@drawable/ic_expand_small" />
</item>
</layer-list>
</item>
错误:(loop for j from 1 below 10 do
#$plot2d(sin(x),[x,0,?j*%pi])$)
我必须使用setf / defvar,但我想使用局部变量。
问题:
谢谢。
答案 0 :(得分:1)
Maxima仅使用动态范围,而不使用词汇范围。 Maxima变量实现为Lisp符号,并声明为特殊符号。为了使J在Maxima中可见,必须以一种或另一种方式将其声明为特殊(通过DEFVAR / DEFPARAMETER或(DECLARE(SPECIAL ...)),我忘记是否还有其他方式)。
我知道这并不令人满意,因为动态范围使名称冲突和细微的错误成为可能。也许您可以使用gensym来确保没有名称冲突;也许写一个宏来用gensym替换另一个变量,并声明gensym特殊,诸如此类。
答案 1 :(得分: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)")