foldl在Maxima中生成绑定栈溢出

时间:2014-03-14 14:03:35

标签: common-lisp maxima computer-algebra-systems

我写了一个函数,它将在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循环或内存饥饿的任务正在进行。

1 个答案:

答案 0 :(得分:2)

好吧,foldl被定义为一个递归函数,它会调用自己多次,因为列表中有元素。因此它是否有效取决于函数调用堆栈的Lisp实现特定限制。对于GCL来说,似乎限制相对较小。对于其他Lisp实现,限制更大。但是,使其适用于列表的所有大小的唯一方法是迭代地编写它。

内置函数与foldl类似 - 请参阅lreducerreducexreducetree_reduce