(wx)Maxima:如何对列表的每个成员迭代一个动作?

(wx)Maxima: how to iterate an action over every member of a list?

我想知道在 Maxima 中是否有一种功能性方法可以将操作应用于列表的每个元素,而不必遍历列表?

例如如果我想从列表 b:[5,4,3,2,1] 中删除列表 a:[1,2,3] 的每个元素。显然,类似于:

f(a,b):=
block(
[aList:a, newList:b],
for k thru length(aList)
do newList: delete(aList[k],newList) 
);

我只是想知道是否有更直接的方法?我认为 apply 可能有效,但无法弄清楚,因为它似乎将整个列表作为参数(相对于列表元素)。

有几种不同的方法可以做到这一点。一种方法是将参数视为集合并应用 setdifference.

(%i2) a: [1, 2, 3] $              

(%i3) b: [5, 4, 3, 2, 1] $

(%i4) setify(a);
(%o4)                       {1, 2, 3}
(%i5) setify(b);
(%o5)                    {1, 2, 3, 4, 5}
(%i6) setdifference (setify(b), setify(a));
(%o6)                        {4, 5}
(%i7) listify(%);
(%o7)                        [4, 5]

如果 ab 确实是集合,即顺序无关紧要,元素是唯一的。

另一种方式:

(%i8) sublist (b, lambda ([x], not member(x, a)));
(%o8)                        [5, 4]

我想 sublist 方法假设较少,因此更普遍适用。