TCL变量范围:访问命令中声明的变量

TCL变量范围:访问命令中声明的变量,tcl,Tcl,我对TCL的可变范围规则感到困惑,下面是一个实验: if {2 > 1} { set x 100 } proc p1 {} { set y 200 } puts $x p1 puts $y 运行脚本会让我: 100 can't read "y": no such variable while executing "puts $y" 这让我感到困惑:关于$y的错误是有道理的,因为y是在proc内部定义的,所以在proc外部是不可访问的。问题是x,为什么它是可访问的

我对TCL的可变范围规则感到困惑,下面是一个实验:

if {2 > 1} {
    set x 100
}
proc p1 {} {
    set y 200
}
puts $x
p1
puts $y
运行脚本会让我:

100
can't read "y": no such variable
    while executing
"puts $y"
这让我感到困惑:关于$y的错误是有道理的,因为y是在proc内部定义的,所以在proc外部是不可访问的。问题是x,为什么它是可访问的?它是在“if”命令的嵌套脚本中定义的

从我的习惯思维来看,从C++的观点来看,这是没有道理的。TCL是否对命令“proc”进行了特殊处理,以便其嵌套脚本中声明的变量的处理方式与其他变量不同,例如“if”、“for”等


顺便说一句,我知道如何使其工作,只是想了解TCL关于变量范围的规则。

TCL中唯一的范围是在或
eval

大括号是容器(脚本或字符串),不是组,并且不定义新范围

该语句由以下部分组成:
if
,后跟一个expr,后跟一个body。expr和body都只是包含表达式和脚本的字符串


请记住,Tcl不是Algol派生语言,您无法将规则从C转移到Tcl。

Tcl中唯一的作用域是在a或a
eval

大括号是容器(脚本或字符串),不是组,并且不定义新范围

该语句由以下部分组成:
if
,后跟一个expr,后跟一个body。expr和body都只是包含表达式和脚本的字符串


请记住,Tcl不是Algol派生的语言,您无法将规则从C转换到Tcl。

如果在
uplevel
中运行p1命令的脚本,它的行为方式也将与
If
命令相同。e、 g.
proc p1{}{uplevel{…}}
。如果在
uplevel
中运行p1命令的脚本,它的行为方式也将与
If
命令相同。e、 g.
proc p1{}{uplevel{…}}