0

TCL 程序示例:

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

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

4

3 回答 3

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

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

文档: procputssetupvar

于 2016-08-11T08:41:08.357 回答
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

现在,使用lindexthere 是完全错误的;它是 Tcl 代码,而不是列表(如果您使用复杂的命令替换,您会看到不同之处)。但是,如果您只使用一个相当简单的词,它就足够了。

于 2016-08-11T08:55:46.513 回答
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.

于 2016-08-11T07:46:25.280 回答