Variables TCL can’;t在花括号内使用变量替换

Variables TCL can’;t在花括号内使用变量替换,variables,tcl,Variables,Tcl,我遇到了一个问题,变量被解释为字符串而不是预期值 我试图将成对的数字附加到一个列表中,按卷曲分组,但它不适用于变量替换 set new_list {} lappend new_list {4 5} lappend new_list {7 8} puts "$list" 输出: {4 5} {7 8} {$i [expr pow($i, 2)]} {$i [expr pow($i, 2)]} {$i [expr pow($i, 2)]} {$i [expr pow($i, 2)]} ....

我遇到了一个问题,变量被解释为字符串而不是预期值

我试图将成对的数字附加到一个列表中,按卷曲分组,但它不适用于变量替换

set new_list {}
lappend new_list {4 5}
lappend new_list {7 8}
puts "$list"
输出:

{4 5} {7 8}
{$i [expr pow($i, 2)]} {$i [expr pow($i, 2)]} {$i [expr pow($i, 2)]} {$i [expr pow($i, 2)]} .... and so on ....
这是所需的格式。 但是,当我尝试以下操作时,比如说,我希望所有整数都为10,并且它们的平方值都作为对附加到列表中:

for {set i 0} {$i < 10} {incr i} {
    lappend new_list {$i [expr pow($i, 2)]}
}
我希望这些值是整数对:
{11}{24}{39}…


有什么帮助吗?

您必须在执行
lappend
时评估单词(表达式等)。要做到这一点,您需要构建附加有
list
construction命令的子列表:

for {set i 0} {$i < 10} {incr i} {
    lappend new_list [list $i [expr {$i ** 2}]]
}
对于{set i 0}{$i<10}{incr i}{
lappend new_list[list$i[expr{$i**2}]
}
大括号本身的意思是“现在不要在此扩展任何内容”。(这是它们在Tcl中的实际含义。只是一些命令,例如
for
,然后直接使用它们内部的内容来完成它们的工作。)在这种情况下,您可以将要插入的内容用双引号括起来,但这是一种不好的做法,因为一旦您开始使用真实世界的数据,它会对您造成很大的伤害(例如在中带有空格的人的姓氏);
list
命令是专门设计的(并且经过了彻底的测试),没有这样的弱点


在这种特殊情况下,我会编写
$I**2
而不是
pow($I,2)
,因为后者总是产生浮点结果,而前者对数字类型敏感(就像其他
expr
运算符一样)。

您必须计算单词(表达式等)在执行
lappend
时。要执行此操作,请构建要附加
list
构造命令的子列表:

for {set i 0} {$i < 10} {incr i} {
    lappend new_list [list $i [expr {$i ** 2}]]
}
对于{set i 0}{$i<10}{incr i}{
lappend new_list[list$i[expr{$i**2}]
}
大括号本身的意思是“现在不要在此扩展任何内容”。(这是它们在Tcl中的实际含义。它只是一些命令,例如
for
,然后立即使用它们内部的内容执行它们的操作。)在这种情况下,您可以将要插入的内容用双引号括起来,但这是一种不好的做法,因为一旦您开始使用真实世界的数据(例如带有空格的人的姓氏),
list
命令是专门设计的(并且经过彻底测试的)没有这样的弱点


在这种特殊情况下,我会编写
$I**2
而不是
pow($I,2)
,因为后者总是产生浮点结果,而前者对数字类型敏感(就像其他
expr
操作符一样)。

或者只使用
$I*$I
进行平方运算,或者只使用
$I*$I
进行平方运算