如何将common-lisp的局部变量传递给最大值?

时间:2018-08-27 16:39:32

标签: common-lisp maxima

我正在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,但我想使用局部变量。

问题:

  • 如何将common-lisp的局部变量传递给最大值?

谢谢。

2 个答案:

答案 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)")