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
之前以任何形式返回错误。