Tcl中利用trace命令监视命令和变量

风行水上 @ 2012-04-24 18:40:01
标签:

    Tcl中常量的实现

    Tcl本身没有常量(const variable)的概念。可以用如下的方法间接实现定义常量。

    proc const {name value} {
      uplevel [list trace add variable $name write trace@const]
      if {0} {
        # used for restore previous value
        uplevel [list set tcl_const($name) $value]
      }
    }
    
    proc trace@const {name key op} {
      if {0} {
        # used for restore previous value
        puts "Warn: const variable '$name' is not allowed to change"
        upvar $name vname
        upvar tcl_const tcl_const
        set vname $tcl_const($name)
        return
      }
      return -code error "$name is a const variable"
    }
    
    const def 123
    set def 456
    puts $def    ;# 输出 123 而不是 456
    

    上面的方法中用if {0}注释掉的部分的作用是把variable重新设置为先前的常量值。这种方法对于通过全局变量(global)或者upvar方式修改变量的情况,不能正确恢复先前设置的常量值。因为传递的变量名可能会有所不同。

    标签:

      分享到:
      comments powered by Disqus

      30/32ms