在我错的地方纠正我。
当我们在大括号内使用变量时,该值不会在评估期间被替换,而是简单地作为参数传递给过程/命令。(是的,有一些例外,例如expr {$x+$y}
)。
考虑以下场景,
方案 1
% set a 10
10
% if {$a==10} {puts "value is $a"}
value is 10
% if "$a==10" "puts \"value is $a\""
value is 10
方案 2
% proc x {} {
set c 10
uplevel {set val $c}
}
%
% proc y {} {
set c 10
uplevel "set val $c"
}
% x
can't read "c": no such variable
% y
10
% set val
10
%
在这两种情况下,我们都可以看到变量替换是在if
循环体(即{puts "value is $a"}
)上执行的,而在循环体中uplevel
,它不是(即{set val $c}
),基于当前上下文。
我可以看到它好像他们可以通过upvar
某种东西访问它。但是,为什么它必须在不同的地方不同?在幕后,为什么要这样设计?或者它只是一种传统的工作方式Tcl
?