代码之家  ›  专栏  ›  技术社区  ›  user1476056

proc关键字的Tcl重命名在名称空间中不起作用

tcl
  •  3
  • user1476056  · 技术社区  · 12 年前

    我有以下程序:

    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 总是返回 ::

    有什么想法吗?

    1 回复  |  直到 12 年前
        1
  •  2
  •   Eric Melski    12 年前

    当你打电话时 _proc ,通过使用 uplevel namespace current 以下为:

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

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