3

我有以下程序:

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命名空间中创建过程,而是在全局命名空间中。调用namespace current总是返回::

有任何想法吗?

4

1 回答 1

2

当您调用 时,使用和_proc的组合在调用上下文的命名空间前添加:uplevelnamespace current

set ns [uplevel 1 {namespace current}]
_proc ${ns}::$name $args $body

这里uplevel 1说,“在调用者的上下文中运行这段代码”,正如你已经知道的,“namespace current”给出了调用它的命名空间的完全限定名称。

于 2012-09-18T05:14:34.687 回答