Variables 用极大值中的方程分解列表

Variables 用极大值中的方程分解列表,variables,maxima,Variables,Maxima,假设我有以下等式列表: list:[x=1,y=2,z=3] 我经常使用这种模式从函数中获得多个返回值。有点像使用对象的方式,例如javascript。然而,在javascript中,我可以做这样的事情。假设myFunction()返回对象{x:1,y:2,z:3},那么我可以使用以下语法对其进行分解: let {x,y,z} = myFunction(); 现在x,y,z被分配了当前范围内的值1,2,3 maxima中有类似的东西吗?现在我用这个: x: subst(list, x); y

假设我有以下等式列表:

list:[x=1,y=2,z=3]

我经常使用这种模式从函数中获得多个返回值。有点像使用对象的方式,例如javascript。然而,在javascript中,我可以做这样的事情。假设
myFunction()
返回对象
{x:1,y:2,z:3}
,那么我可以使用以下语法对其进行分解:

let {x,y,z} = myFunction();
现在
x,y,z
被分配了当前范围内的值
1,2,3

maxima中有类似的东西吗?现在我用这个:

x: subst(list, x); 
y: subst(list, y);
z: subst(list, z);

您可能可以实现它并编写一个函数,该函数可以被称为
f(['x,'y,'z],list)
;但您必须能够在符号和值之间进行一些赋值。这可以通过编写一个小小的特殊Lisp函数来实现:

(defun $assign (symb val) (set symb val))
通过首先键入(Maxima中的表单),您可以看到它是如何工作的(作为第一个测试):

然后,将其用作:
assign('x,42)
,它应该将值
42
分配给最大变量
x

如果你想这样做,你应该在
~/.maxima
目录中编写一个小的Lisp文件(这是一个可以放置你最常用函数的目录);例如调用它
myfuncs.lisp
,并将函数放在上面(不带
:lisp
前缀);然后编辑(在同一个目录中)启动时读取的
maxima init.mac
文件,并添加以下两个内容:

  • 添加一行,其中包含加载(“myfuncs.lisp”)在以下部分之前
  • 定义自己的Maxima函数(使用简单的Maxima语法,无需关心Lisp)。你的函数应该包含某种循环来执行所有的赋值;现在可以对每个变量使用
    assign(symbol,value)
    函数
您的函数可能类似于:

f(vars, l) := for i:1 thru length(l) do assign(vars[i], l[i]) $
它仅将第二个参数中的每个值赋给第一个参数中的相应符号


因此,
f(['x,'y],[1,2])
将执行预期的分配;当然,你可以从这开始,更准确地做你需要的事情。

这个怎么样。设
l
somesymbol=somevalue
形式的方程式列表。我认为你所需要的是:

map (lhs, l) :: map (rhs, l);
这里
map(lhs,l)
生成符号列表,
map(rhs,l)
生成值列表。运算符
表示计算左侧并将右侧分配给它。当左侧为列表时,Maxima将右侧的每个值分配给左侧的相应元素

例如:

有趣的技巧:)谢谢你告诉我如何在maxima中使用lisp代码。
map (lhs, l) :: map (rhs, l);
(%i1) l : [a = 12, b = 34, d = 56] $
(%i2) map (lhs, l) :: map (rhs, l);
(%o2)                            [12, 34, 56]
(%i3) values;
(%o3)                            [l, a, b, d]
(%i4) a;
(%o4)                                 12
(%i5) b;
(%o5)                                 34
(%i6) d;
(%o6)                                 56