Tcl 由于嵌套求值过多(无限循环?)而导致获取错误

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

我已经编写了knowproc来处理一些场景。我写的是

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
将在那里找到答案。