帕雷停止了在TCL的工作

帕雷停止了在TCL的工作,tcl,Tcl,我已经更改了TCL内置未知过程。我已将unknown重命名为\u unknown,并在新的unknown过程中进行了一些自定义检查。问题是它阻止了帕雷通讯。当我设置一个数组,然后进行parray时,它会打印消息无效的命令名“parray abc” 下面是代码 rename unknown _unknown proc unknown args { puts "inside unknwn proc" if { ![regexp {65ABC::\w+\s.*} $args] } {

我已经更改了TCL内置
未知
过程。我已将
unknown
重命名为
\u unknown
,并在新的unknown过程中进行了一些自定义检查。问题是它阻止了帕雷通讯。当我设置一个数组,然后进行parray时,它会打印消息
无效的命令名“parray abc”

下面是代码

rename unknown _unknown
proc unknown args {
    puts "inside unknwn proc"
    if { ![regexp {65ABC::\w+\s.*} $args] } {
        uplevel 1 [list _unknown $args]
    } else {
        regexp {(65SABC::\w+)\s+(.*)} $args - procName params
        regsub {65ABC::} $procName "65ABC8X::" procName
        eval "$procName $params"
    }
}

set abc(1) one
parray abc

inside unknwn proc
invalid command name "parray abc" 
问题是:

uplevel 1 [list _unknown $args]
因为这迫使整个参数列表被解释为单个参数。这就是奇怪的命令名。 确切地说,问题是您最终调用的是相当于
uplevel1{{u unknown{parray abc}}
,而不是
uplevel1{u unknown parray abc}
(这是您真正想要调用的)。Tcl通常对单词边界和错误消息非常精确;如果你仔细阅读,它们会准确地告诉你哪里出了问题

它应该是其中之一:

uplevel 1 [list _unknown {*}$args]

如果您使用的是8.5或8.6,则首选第一种;使用8.4(或更早版本)上的第二个。

我无法复制您的代码。。。即使重命名了
unknown
,我也能让
parray
正常工作。你是否启动了新shell或将代码粘贴到同一shell中也无法重现错误。我认为您的代码中一定有其他错误。@Nitesh我将整个代码复制/粘贴到了一个新的shell中。我将代码粘贴到codepad.org中,得到了与此相同的错误。这正在工作。我使用了第二种选择。如果您能让我知道为什么解决方案有效,为什么我们没有得到这个错误,那就太好了?为什么
unknown
首先被调用?@Nitesh很抱歉之前的简短回答;我正要去这里开会@Hoodiecrow测试前是否运行了
parray
?这将自动加载
parray
实现,因此调用它不会通过
unknown
(其中的标准实现包含对自动加载程序的调用)。是的,当我看到人们的问题时,我通常会先运行代码进行比较,然后尝试介绍问题,然后再试一次。现在,这种方法似乎不再是最优的。完全至少我应该在不同的、新启动的解释器中运行“好代码”和“坏代码”。(这是一种自我提醒。)
uplevel 1 _unknown $args