私の質問の背景: エラー状況を特定するのに役立つ追加メッセージを書き出すエラー手順を書きたいと思います。この追加情報が提供されているコード部分と提供されていないコード部分があります。私の考えは:
- グローバル メッセージ変数
message
を空の文字列に設定する message
エラーを引き起こす可能性のあるプロシージャを呼び出す前に、ローカル メッセージ変数を作成します。- エラー手順: 変数のすべてのレベルを下方向に検索し
message
、最初に見つかった値を取得します
グローバルmessage
変数を設定して、常にこれにアクセスすることもできますが、後でリセットする必要があります (設定されていない他の部分でエラーメッセージが表示されるのを防ぐためmessage
)。
私はsearchVar
手順を書きました:
proc searchVar {varname} {
set thisLevel [info level]
for {set lvl 0} {$lvl <= $thisLevel} {incr lvl} {
upvar $lvl $varname var
if {[info exists var]} {
return $var
}
}
return ""
}
ここにいくつかのテストコードがあります:
set message "value at global level"
proc withoutlocal1 {} {
puts "withoutlocal1 message = [searchVar message]"
}
proc withoutlocal2 {} {
puts "withoutlocal2 message = [searchVar message]"
withoutlocal1
}
proc withlocal {} {
set message "value at withlocal level"
puts "withlocal message = [searchVar message]"
withoutlocal2
}
withoutlocal1
puts ""
withoutlocal2
puts ""
withlocal
を与える
withoutlocal1 message = value at global level
withoutlocal2 message = value at global level
withoutlocal1 message = value at global level
withlocal message = value at withlocal level
withoutlocal2 message = value at withlocal level
withoutlocal1 message = value at withlocal level
これにより、目的の動作が得られます。 の値message
は、最後に定義されたものです (呼び出し順序に関して)。
私の質問は次のとおりです。よりコンパクトな、または「標準的な」ソリューションはありsearchVar
ますか? それとも、問題全体に対するより洗練された解決策ですか?