Maxima lambda 不计算其主体内的任何表达式,因此不计算 f(到 g)。这就是您所看到的行为。我可以看到它的动机是 lambda 正文可能包含在某些变量具有值之前没有预期效果的表达式,例如length、for ...、print等
您可以通过替换到正文中来获得预期的行为。这里有两种方法可以做到这一点。第一个使用函数subst,我认为这可能是最明显的。
(%i1) X(f):= subst ('f = f, lambda([x,y],x*f(x,y)));
(%o1) X(f) := subst('f = f, lambda([x, y], x f(x, y)))
(%i2) X(g);
(%o2) lambda([x, y], x g(x, y))
(%i3) X(g)(z, t);
(%o3) z g(z, t)
第二个使用函数buildq,它实际上是一个替换函数,它引用(不计算)被替换的表达式。
(%i4) X(f) := buildq ([f], lambda ([x, y], x*f(x, y)));
(%o4) X(f) := buildq([f], lambda([x, y], x f(x, y)))
(%i5) X(g);
(%o5) lambda([x, y], x g(x, y))
(%i6) X(g)(z, t);
(%o6) z g(z, t)
最后,如果您有兴趣更频繁地使用评估表达式创建 lambda 表达式,您可以为此创建自己的 lambda。我这里叫evlambda。
(%i11) evlambda (a, b) := apply (lambda, [a, b]);
(%o11) evlambda(a, b) := apply(lambda, [a, b])
(%i12) X(f) := evlambda ([x, y], x*f(x, y));
(%o12) X(f) := evlambda([x, y], x f(x, y))
(%i13) X(g);
(%o13) lambda([x, y], x g(x, y))
(%i14) X(g)(z, t);
(%o14) z g(z, t)
这里的关键是evlambda 被定义为一个普通函数,所以它的参数是被计算的。因此,在应用 lambda 时,b 已被评估,因此它包含 g。
请注意,这个evlambda 不会对length、for ... 和print 做任何有用的事情,这是意料之中的。
(%i15) foo : evlambda ([l], 1 + length(l));
length: argument cannot be a symbol; found l
-- an error. To debug this try: debugmode(true);
(%i16) bar : evlambda ([n], for i thru n do print (i));
Unable to evaluate predicate 1 > n
-- an error. To debug this try: debugmode(true);
(%i17) baz : evlambda ([x], print (x));
x
(%o17) lambda([x], x)
(%i18) baz(5);
(%o18) 5
最后一个,print,在定义baz 时评估print(所以x 是输出),但在评估baz(5) 时不会再次评估——这种行为是意料之中的因为evlambda 会评估它的参数。