如何读取存储值的变量Name

时间:2016-08-11 07:24:53

标签: tcl tclsh

TCL计划示例:

proc fun { x } {
    puts "$$x = $x"
}
set a 10
fun $a

在上面的程序中打印输出为$10 = 10但是我想让a = 10得到输出。必须读取传递值的变量以及相应的值。有没有办法读取变量名称。

3 个答案:

答案 0 :(得分:2)

proc fun name {
    upvar 1 $name var
    puts "$name = $var"
}
set a 10
fun a

upvar命令采用名称并创建具有该名称的变量的别名。

文档: procputssetupvar

答案 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