TCL计划示例:
proc fun { x } {
puts "$$x = $x"
}
set a 10
fun $a
在上面的程序中打印输出为$10 = 10
但是我想让a = 10
得到输出。必须读取传递值的变量以及相应的值。有没有办法读取变量名称。
答案 0 :(得分:2)
proc fun name {
upvar 1 $name var
puts "$name = $var"
}
set a 10
fun a
upvar命令采用名称并创建具有该名称的变量的别名。
答案 1 :(得分:1)
如果您拥有当前支持的Tcl版本(8.5或8.6),则可以使用info frame -1
查找有关呼叫者的一些信息。其中有各种各样的信息,但我们可以做一个合理的近似:
proc fun { x } {
set call [dict get [info frame -1] cmd]
puts "[lindex $call 1] = $x"
}
set a 10
fun $a
# ==> $a = 10
fun $a$a
# ==> $a$a = 1010
现在,使用lindex
存在严重错误;它是Tcl代码,而不是列表(如果使用复杂的命令替换,你会看到差异)。但如果你只使用一个相当简单的单词,它就足够了。
答案 2 :(得分:0)
% set x a
a
% set a 10
10
% eval puts $x=$$x
a=10
% puts "$x = [subst $$x]"
a = 10
% puts "$x = [set $x]"
a = 10
%
如果要将变量传递给过程,那么您应该依赖upvar
。