使用最大值的方程对列表进行解构

时间:2017-10-27 12:54:28

标签: 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: subst(list, y);
z: subst(list, z);

2 个答案:

答案 0 :(得分:2)

这个怎么样?设lsomesymbol = somevalue形式的方程列表。我想你所需要的只是:

map (lhs, l) :: map (rhs, l);

此处map(lhs, l)生成符号列表,map(rhs, l)生成值列表。运算符::表示评估左侧并为其指定右侧。当左侧是列表时,Maxima会将右侧的每个值分配给左侧的相应元素。

E.g:

(%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

答案 1 :(得分:1)

你可以实现它并编写一个可以被称为f(['x, 'y, 'z], list)的函数;但是你必须能够在符号和值之间进行一些分配。这可以通过编写一个小的 ad hoc Lisp函数来完成:

(defun $assign (symb val) (set symb val))

首先输入(Maxima中的表格),你可以看到它是如何工作的(作为第一个测试):

:lisp (defun $assign (symb val) (set symb val))

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

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

  • 在以下部分之前添加包含load("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])将执行预期的分配;当然,你可以从那开始,更准确地做你需要的东西。