Tcl 由于嵌套求值过多(无限循环?)而导致获取错误
我已经编写了knowproc来处理一些场景。我写的是Tcl 由于嵌套求值过多(无限循环?)而导致获取错误,tcl,Tcl,我已经编写了knowproc来处理一些场景。我写的是 proc unknown args { if { ![regexp {65ABC::\w+\s.*} $args] } { uplevel 1 [list _unknown $args] } } 当我在TCL中键入错误的命令(比如acbsv)时,它抛出了一个错误,如下所示: too many nested evaluations (infinite loop?) 解决方案:如果我正在添加命令 rename
proc unknown args {
if { ![regexp {65ABC::\w+\s.*} $args] } {
uplevel 1 [list _unknown $args]
}
}
当我在TCL中键入错误的命令(比如acbsv
)时,它抛出了一个错误,如下所示:
too many nested evaluations (infinite loop?)
解决方案:如果我正在添加命令
rename unknown _unknown
它正在工作,但不知道为什么我会得到错误,为什么我在添加
重命名命令时会得到解决如果定义未知调用\u未知但没有\u未知
命令,会发生什么?容易的!Tcl调用unknown
尝试修复问题。对于一个简单的未知
定义,这会导致一个递归循环,试图通过调用\u unknown
来处理一个不存在的\u unknown
,但是它不存在,所以我们称之为\u unknown
等等
acbsv --> "no such command; call unknown"
unknown acbsv --> "I can do this..."
_unknown acbsv --> "no such command; call unknown"
unknown _unknown --> "I can do this..."
_unknown _unknown --> "no such command; call unknown"
unknown _unknown --> "I can do this..."
_unknown _unknown --> "no such command; call unknown"
unknown _unknown --> "I can do this..."
_unknown _unknown --> "no such command; call unknown"
unknown _unknown --> "I can do this..."
...
Tcl对最大堆栈深度施加了限制,以防止此类事情导致实际问题。如果需要,您可以提高堆栈深度限制(例如,使用interp recursionlimit{}1500
),但建议您仅在确实需要时这样做。大多数代码不是这样,因为Tcl程序员倾向于编写命令式迭代代码,而不是函数式代码。(Tcl 8.4和8.5中的硬限制相当低,因为递归的Tcl调用会导致递归的C调用,并且其中的一些东西有大量的激活记录。Tcl 8.6没有这样的限制,因为使用了“无堆栈”实现;如果您愿意,您可以在堆内存允许的范围内深入。)您是否创建了名为unknown
的程序,并且在脚本前面使用了重命名unknown unknown\uuuz
?我猜您使用的proc unknown
将在那里找到答案。