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は、「呼び出し元のコンテキストでこのコードのスニペットを実行する」と述べていますが、ご存知のように、「現在の名前空間」は、呼び出された名前空間の完全修飾名を示します。

于 2012-09-18T05:14:34.687 に答える