我写了一个函数,它将在Maxima中执行类似于Haskell的foldl
,
foldl(f,ac,li):=block([con:[],acc:ac],/*print("List=",li,ac),*/
if (is(li#[])) then
(acc:apply(f,cons(acc,[first(li)])),
acc:foldl(f,acc,rest(li))),acc)$
它可以很好地从左侧折叠列表并沿途进行评估,从而防止在缓冲区中长期未评估的表达式累积。
我在使用
运行时面临的问题foldl(lambda([x,y],x+y),0,makelist(i,i,1,97));
PROGN [或被调用者]出错:绑定堆栈溢出。
但如果我将它运行到96,它会适当地生成结果。 我不明白为什么这个简单的添加会导致问题,因为我没有任何infinte循环或内存饥饿的任务正在进行。
答案 0 :(得分:2)
好吧,foldl
被定义为一个递归函数,它会调用自己多次,因为列表中有元素。因此它是否有效取决于函数调用堆栈的Lisp实现特定限制。对于GCL来说,似乎限制相对较小。对于其他Lisp实现,限制更大。但是,使其适用于列表的所有大小的唯一方法是迭代地编写它。
内置函数与foldl
类似 - 请参阅lreduce
,rreduce
,xreduce
和tree_reduce
。