「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)
「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)
このコマンドを使用して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、呼び出しスタックからラッパーが完全に削除されます。これは、確かにあなたの場合は必要ないかもしれませんが、それができるのは素晴らしいことです。
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の答えは、私が通常コマンドをラップする方法に近く、非手順コマンドでも機能するという利点があります.しかし、このソリューションにはコードをバインドするという利点があります.後で間違いがほとんどないように、きちんとタイトに。また、エラー トレースに余分なスタック フレームが導入されないため、デバッグをシンプルに保つことができます。