4

「proc N」の定義を、同じ名前と呼び出し規約の proc に置き換えたいと思いますが、エラー検出コードを少し追加します。

Pythonでは、以下のようにやりたいことができましたが、名前空間と関数ハンドルがtclでどのように機能するかを把握していません.

__orig_N = N
def N(arg1, arg2):
    if arg1 != 'GOOD VALUE':
        exit('arg1 is bad')
    return __orig_N(arg1, arg2)
4

2 に答える 2

10

このコマンドを使用してrename、既存のprocの名前を変更できます。

rename N __orig_N
proc N {arg1 arg2} {
    if { $arg1 != "GOOD_VALUE" } {
        puts stderr "arg1 is bad"
        exit 1
    }
    return [uplevel 1 __orig_N $arg1 $arg2]
}

これは実際には、Pythonのオリジナルよりも少し洗練されており、を使用するとuplevel、呼び出しスタックからラッパーが完全に削除されます。これは、確かにあなたの場合は必要ないかもしれませんが、それができるのは素晴らしいことです。

于 2011-05-24T18:12:32.540 に答える
4

Tcl は、プロシージャーに関して非常に優れたイントロスペクションを持っています。これにより、プロシージャを書き直して、さらにコードを追加できます。

# Assume there are no defaults; defaults make this more complicated...
proc N [info args N] [concat {
    # Use 'ne' for string comparison, '!=' for numeric comparison
    if {$arg1 ne "GOOD VALUE"} {
        error "arg1 is bad"
        # The semicolon is _important_ because of the odd semantics of [concat]
    };
} [info body N]]

OK、それが唯一の方法ではありません.Ericの答えは、私が通常コマンドをラップする方法に近く、非手順コマンドでも機能するという利点があります.しかし、このソリューションにはコードをバインドするという利点があります.後で間違いがほとんどないように、きちんとタイトに。また、エラー トレースに余分なスタック フレームが導入されないため、デバッグをシンプルに保つことができます。

于 2011-05-24T19:24:21.757 に答える