Tcl重命名proc关键字不';无法在名称空间中正常工作
我有以下程序:Tcl重命名proc关键字不';无法在名称空间中正常工作,tcl,Tcl,我有以下程序: rename proc _proc _proc proc {name args body} { global pass_log_trace set g_log_trace "0" if {[info exists pass_log_trace]} { set g_log_trace $pass_log_trace } # simple check if we have double declaration of the
rename proc _proc
_proc proc {name args body} {
global pass_log_trace
set g_log_trace "0"
if {[info exists pass_log_trace]} {
set g_log_trace $pass_log_trace
}
# simple check if we have double declaration of the same procedure
if {[info procs $name] != ""} {
puts "\nERROR: redeclaration of procedure: $name"
}
_proc $name $args $body
if {$g_log_trace != 0} {
trace add execution $name enter trace_report_enter
trace add execution $name leave trace_report_leave
}
}
此过程的目的主要是向代码中的所有过程添加入口和出口点跟踪程序。但是,出于某种原因,它还删除了名称空间范围。例如,这样的代码:
namespace eval bob {
namespace eval joe {
proc proc1 {} {}
}
proc proc2 {} {
puts "proc2"
}
}
puts "Namespace calling [info procs ::bob\::*]"
不会在bob
命名空间中创建过程,而是在全局命名空间中创建过程。
调用当前命名空间
总是返回:
有什么想法吗?当您调用
\u proc
时,通过使用uplevel
和名称空间current
的组合来预先设置调用上下文的名称空间:
set ns [uplevel 1 {namespace current}]
_proc ${ns}::$name $args $body
这里
uplevel1
说,“在调用者的上下文中运行这段代码”,正如您已经知道的,“namespace current”给出了调用它的名称空间的完全限定名。可能使用tcllib logger trace命令获得类似效果。如果程序处于最高级别,则$ns将为“:”。这段代码不是在$name前面创建了四个“:”吗?即使这样,Tcl名称空间分隔符也是两个或更多的双冒号,所以应该不会有什么害处。我不想提出这一点,但出于某种原因,上面的代码在第一次调用名称空间内的过程时产生了Tcl\u eval
调用错误Tcl_eval
返回错误消息:unknown command proc2
。调用info procs::bob::proc2
返回正确的状态。@user1476056:不确定您的期望是什么--听起来您可能试图从全局范围调用proc2
,但显然您只在bob
命名空间中定义了proc2
,因此,显然您必须给出完全限定名,::bob::proc2
,或者必须确保仅在您已经在bob
命名空间中时调用proc2
(来自bob
命名空间中的另一个proc,或者使用命名空间eval::bob{proc2}
@Eric:我知道我必须为proc2
指定正确的名称空间。但是错误发生在调用之前。似乎\u proc
已经运行,Tcl\u eval
在调用proc2
之前以任何形式返回错误。