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方式修改变量的情况,不能正确恢复先前设置的常量值。因为传递的变量名可能会有所不同。