gpt4 book ai didi

common-lisp - 为什么应用大表上会引发CONTROL-STACK-EXHAUSTED-ERROR?

转载 作者:行者123 更新时间:2023-12-05 01:24:22 27 4
gpt4 key购买 nike

(apply #'+ (loop for i from 1 to x collect 1))


如果 x的值为 253391,则有效,但 (SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR) *上的 253392失败。这比 call-arguments-limit **小几个数量级。

递归耗尽了堆栈吗?如果是这样,是否在 apply中?为什么没有对其进行优化?



*同样有趣的是, (apply #'max (loop for i from 1 to 253391 collect 1))会引发错误,但是 253390可以。

** call-arguments-limit的值为4611686018427387903(在 format的帮助下,事实证明这是四百一十一亿六千四百亿六百八十六万亿一千八百二十三亿三千八百三十八-7393)

最佳答案

可以传递给SBCL中的函数的参数


您不传递参数。您传递参数。

(defun foo (x y) (list x y))


xy是函数 foo的参数。

(foo 20 22)


2022是函数 foo的调用中的参数。

请参见变量 call-arguments-limitlambda-parameters-limit

SBCL和调用参数限制

如果一个函数几乎不能处理声明数量的参数,那么这看起来像 SBCL中的错误。您可能要报告此错误。也许他们需要更改 call-arguments-limit的值。

测试中

APPLY是测试它的一种方法。

另一个:

(eval (append '(drop-params)
(loop for i from 1 to 2533911 collect 1)))


也可以将FUNCALL与许多参数一起使用。

为什么存在限制?

编写Common Lisp标准是为了允许在各种不同的计算机上进行有效的实现。据认为,某些机器级别的函数调用实现仅支持有限数量的参数。该标准说,支持的参数数量可以低至 50。实际上,某些实现所支持的参数数量相对较少。

因此,Common Lisp中的 apply不是用于列表处理的工具,而是用于调用带有已计算的arglist的函数。

对于列表和向量处理,请使用REDUCE而不是APPLY

如果要对列表中的所有数字求和,请替换

(apply #'+ list)     ; don't use this




(reduce #'+ list)    ; can handle arbitrary long lists


递归


apply是非优化的递归函数


我看不到为什么函数 APPLY应该使用递归。

例如,如果您想到

(apply #'+ '(1 2 3 4 5))


参数的重复求和是通过函数 +而不是通过 apply完成的。

这不同于

(reduce #'+ '(1 2 3 4 5))


其中带有两个参数的函数 +的重复调用由 reduce完成。

关于common-lisp - 为什么应用大表上会引发CONTROL-STACK-EXHAUSTED-ERROR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42219696/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com