循环中的基本TCL变量解除引用

时间:2015-04-24 09:03:28

标签: tcl

我有一个类似于:

的循环
foreach x {a b} {
    set type_$x [some_function_here]
    set N_$x [function type_$x]
    }

问题是我想在第二行中取消引用type_ $ a并将其值用作函数参数。

但是在做:

set N_$x [function $type_$x]

不起作用,我用subst命令尝试过的任何其他组合都没有。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

三种可能性,按照我认为你应该多喜欢它们的顺序。

阵列

到目前为止,最简单的技术是使用数组:

foreach x {a b} {
    set type($x) [some_function_here]
    set N($x) [function $type($x)]
}

这确实改变了你的程序的其他部分看到的东西,所以它不是零影响技术,但它很容易;我认为这是最常推荐的做法。

本地别名

或者,使用upvar 0为变量命名变量创建一个本地别名:

foreach x {a b} {
    upvar 0 type_$x typex N_$x Nx
    set typex [some_function_here]
    set Nx [function $typex]
}

在内部,名称只解析为同一个存储单元,因此这是一种有效的技术(尽管upvar 0非常棘手!)

单参数set

最后,您可以使用带有一个参数的set命令从任意命名的变量中读取; $语法可以说只是语法糖。

foreach x {a b} {
    set type_$x [some_function_here]
    set N_$x [function [set type_$x]]
}

如果你经常这样做,它通常是一种代码味道,它通常表明你应该使用数组。

答案 1 :(得分:1)

set N_$x [function [set type_$x]]

$var表示法基本上是命令[set var]的简写,有时您需要使用命令而不是速记。

没有办法告诉命令评估“当我说'$ type_ $ x'时,我希望你保持评估第一个$,直到整个变量名被放在一起”。也就是说,除非您将其写为[set type_$x],否则首先构建名称type_atype_b,然后传递给set

文档:setevaluation syntax

答案 2 :(得分:0)

其他一些方法可以使用动态名称来修改变量。

% set x a
a
% set type_$a stackoverflow
stackoverflow
% expr \$type_$a
stackoverflow
% subst $[subst type_$a]

这有点复杂,但与其他方法相比。