我尝试在maxima中编写curried函数,但似乎无法在lambda函数中获取参数,这是我的代码:
structp(type) := lambda([struct], is(reveal(struct, 1) = type));
我想让它像这样工作,说我有:
defstruct(a(b,c));
struct: a(1,2);
structp(a)(struct);
最后一个应该返回true,因为struct
的类型为a
。
在某种程度上可以在lambda函数中获取参数吗?
我喜欢在这里使用curried函数,因为这样我可以编写这样的短代码:
sublist(list_of_structs, structp(a));
答案 0 :(得分:2)
在将lambda应用于参数之前,不会评估lambda
内的表达式。例如。如果您有f(y) := lambda([x], y*x)
,那么f(5)
会返回lambda([x], y*x)
(而不是lambda([x], 5*x)
。)
至少有几种方法可以获得您想要的效果。我想也许最简单的是f(y) := subst('y = y, lambda([x], y*x))
。或者在你给出的例子中:
structp(type) :=
subst ('type = type, lambda([struct], is(reveal(struct, 1) = type)));
然后structp(a)
根据需要返回lambda([struct], is(reveal(struct, 1) = a))
。
编辑:还有其他方法可以达到同样的效果。看看buildq
。