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