0

私の質問の背景: エラー状況を特定するのに役立つ追加メッセージを書き出すエラー手順を書きたいと思います。この追加情報が提供されているコード部分と提供されていないコード部分があります。私の考えは:

  • グローバル メッセージ変数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ますか? それとも、問題全体に対するより洗練された解決策ですか?

4

0 に答える 0