Recursion 我可以无限期地递归地为TCL脚本提供源代码吗?

Recursion 我可以无限期地递归地为TCL脚本提供源代码吗?,recursion,tcl,stack-overflow,Recursion,Tcl,Stack Overflow,我有一个运行在TCL shell中的TCL脚本(synopsys黄金时间,如果有任何区别的话)。 脚本由shell中的source启动。 脚本通过在脚本末尾调用source,在经过特定时间间隔后递归调用自身。 我的问题有点学术性:如果脚本一直用这种方法调用自己,是否会出现堆栈溢出问题 如果我展开这个问题:当一个TCL脚本源于另一个脚本时会发生什么?它是否分叉到子进程?如果是这样的话,那么每个调用都会分叉到另一个子进程,最终会堆积成一堆进程——但由于源命令本身不是并行的——因此就没有分叉(据我所知

我有一个运行在TCL shell中的TCL脚本(synopsys黄金时间,如果有任何区别的话)。 脚本由shell中的
source
启动。 脚本通过在脚本末尾调用
source
,在经过特定时间间隔后递归调用自身。 我的问题有点学术性:如果脚本一直用这种方法调用自己,是否会出现堆栈溢出问题

如果我展开这个问题:当一个TCL脚本源于另一个脚本时会发生什么?它是否分叉到子进程?如果是这样的话,那么每个调用都会分叉到另一个子进程,最终会堆积成一堆进程——但由于源命令本身不是并行的——因此就没有分叉(据我所知)

希望问题清楚。 谢谢。

简短回答:是的

如果您使用的是Tcl 8.5或更早版本,您将用完C堆栈。有代码尝试检测它,如果检测到,则抛出软(
catch
able)错误。可以执行的递归次数也有一个(较低)限制,可以通过
interp recursionlimit
控制。请注意,这是对核心Tcl脚本解释器引擎的递归项计数;它在脚本中并不完全是递归级别,尽管它非常接近

# Set the recursion limit for the current interpreter to 2000
interp recursionlimit {} 2000
默认值为1000,这对于几乎任何非递归算法都足够了

在Tcl 8.6中,非递归执行引擎用于大多数命令(包括
source
)。这使您的代码可以使用更大的递归深度,主要受您拥有的通用内存的限制。我已经成功地在传统硬件上运行了递归深度超过一百万的代码


不过,您仍然需要提高
interp recursionlimit
;默认的1000限制仍然存在,因为它捕获的bug(即无意的递归)比未捕获的多。只是您可以有意义地提高它更多。

该命令不会产生新的进程。它的作用就好像源文件中的行代替了对源文件的调用。除非您另有指定,否则它们将由当前解释器解释

8.6的NRE引擎还允许Tcl代码使用
tailcall
coroutine
yield