用最大值的方程解构列表
Destructuring a list with equations in maxima
假设我有以下方程列表:
list: [x=1, y=2, z=3];
我经常使用这种模式从一个函数中获得多个 return 值。有点像您使用对象的方式,例如 javascript。然而,在javascript,我可以做这样的事情。假设 myFunction()
return 是对象 {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)
;但是您必须能够在符号和值之间进行一些分配。这可以通过编写一个微小的 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])
将执行预期的分配;当然你可以从那开始做你需要的更精确。
这个怎么样。设 l
为 somesymbol = somevalue
形式的方程列表。我想你只需要:
map (lhs, l) :: map (rhs, l);
此处 map(lhs, l)
生成符号列表,map(rhs, l)
生成值列表。运算符 ::
表示评估左侧并将右侧分配给它。当左侧是列表时,Maxima 将右侧的每个值分配给左侧的相应元素。
例如:
(%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
假设我有以下方程列表:
list: [x=1, y=2, z=3];
我经常使用这种模式从一个函数中获得多个 return 值。有点像您使用对象的方式,例如 javascript。然而,在javascript,我可以做这样的事情。假设 myFunction()
return 是对象 {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)
;但是您必须能够在符号和值之间进行一些分配。这可以通过编写一个微小的 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])
将执行预期的分配;当然你可以从那开始做你需要的更精确。
这个怎么样。设 l
为 somesymbol = somevalue
形式的方程列表。我想你只需要:
map (lhs, l) :: map (rhs, l);
此处 map(lhs, l)
生成符号列表,map(rhs, l)
生成值列表。运算符 ::
表示评估左侧并将右侧分配给它。当左侧是列表时,Maxima 将右侧的每个值分配给左侧的相应元素。
例如:
(%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