提升变量范围而不知道其名称

时间:2014-07-17 21:52:12

标签: tcl upvar

我需要来自source'd文件的'upvar'变量(我不知道他们的名字)

假设我有一个包含以下内容的TCL文件:

set v 7

现在这个:

proc p {} {
  source t.tcl
}

p

puts $v
# => can't read "v": no such variable

不得更改文件t.tcl。

我也无法了解t.tcl的内容。我们假设它作为env变量传递。如何在顶层显示v

1 个答案:

答案 0 :(得分:3)

对于您发布的代码,请将p的定义更改为:

proc p {} {
    upvar 1 v v
    source t.tcl
}

或(专门将变量连接到顶层:

proc p {} {
    upvar #0 v v
    source t.tcl
}

(注意:语法高亮显示器认为字符串"#0 v v"是注释,但事实并非如此。)

env的成员是全球性的,所以你不会遇到那个问题。

但是,如果您不知道变量的名称,那么它就不那么简单了,因为一旦变量存在,就不能upvar变量。

是否可以在顶层评估source命令,如下所示:

proc p {} {
    uplevel #0 source t.tcl
}

(同样,不是评论。)

或者你必须在p级别评估吗?

文档:procputssetsourceuplevelupvar

env

的文档

(注意:评论中提到的'Hoodiecrow'是我,我之前使用过那个昵称。)