0

我写了一个函数,其性能foldl类似于 Maxima 中的 Haskell,

  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,它会适当地生成结果。我不明白为什么这个简单的加法会导致问题,因为我没有任何无限循环或内存消耗任务正在进行。

4

1 回答 1

2

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

有类似的内置函数foldl--see lreducerreducexreducetree_reduce.

于 2014-03-14T23:00:01.387 回答