Namespaces TCL名称空间和堆栈框架之间有什么区别?
Upvar创建指向中变量的链接,有时称为a或a Upvar还用于为全局(或命名空间)变量创建别名。但名称空间仅由命令创建。proc命令将创建一个新的堆栈帧 名称空间和调用堆栈似乎是可以更改的两种方式。Upvar和Uplevel可以在名称空间和调用堆栈上工作Namespaces TCL名称空间和堆栈框架之间有什么区别?,namespaces,tcl,callstack,upvar,uplevel,Namespaces,Tcl,Callstack,Upvar,Uplevel,Upvar创建指向中变量的链接,有时称为a或a Upvar还用于为全局(或命名空间)变量创建别名。但名称空间仅由命令创建。proc命令将创建一个新的堆栈帧 名称空间和调用堆栈似乎是可以更改的两种方式。Upvar和Uplevel可以在名称空间和调用堆栈上工作 我做对了吗?我还没有看到调用堆栈和名称空间之间的直接比较,因此我的问题是。不,不完全是。名称空间和调用框架是非常不同的概念。名称空间是名称的层次结构,可以消除同义词的歧义。程序中可能有三个名为foo的变量,但如果将它们放在不同的名称空间中,它
我做对了吗?我还没有看到调用堆栈和名称空间之间的直接比较,因此我的问题是。不,不完全是。名称空间和调用框架是非常不同的概念。名称空间是名称的层次结构,可以消除同义词的歧义。程序中可能有三个名为
foo
的变量,但如果将它们放在不同的名称空间中,它们不会冲突。名称空间可用于变量名和命令名。使用namespace eval
创建名称空间后,在对其调用namespace delete
之前,名称空间的内容始终是可访问的
调用堆栈是一系列堆栈帧。第一个堆栈帧#0始终存在。每当调用命令时,就会创建其他堆栈帧(这主要适用于用户定义过程的命令,“内置”命令遵循自己的规则)。当命令返回时,它们将再次被销毁。因此,如果调用命令A,A调用命令B,B调用命令C,则调用堆栈如下所示:
#3 : <C's variables>
#2 : <B's variables>
#1 : <A's variables>
#0 : <global and namespace variables>
只有一些命令推送堆栈帧。大家都知道的是过程调用和
namespace eval
。(还有其他一些,特别是在TclOO中…)谢谢,@Hoodiecrow,你填了一些细节。通过谷歌搜索,我发现名称空间和调用框架是不同的。名称空间是可选的,也许在小脚本中最好避免(但对于代码重用很有用)。每次调用过程时,都会创建调用帧。进一步澄清:我的问题中是否陈述了任何不真实的内容?@user901750:有一些有问题的陈述。您是说堆栈帧有时称为调用堆栈。这是错误的,但我想这是一个错误?proc
命令不创建堆栈帧(但它创建的命令在调用时创建堆栈帧)。命名空间不会更改Tcl命名上下文,但namespace eval
会更改(通过创建新的堆栈框架)upvar
和uplevel
本身不处理(操纵)名称空间,但可以像处理变量的任何其他命令一样访问名称空间变量。
namespace eval ::abc {
variable def 42
proc xyz {} {
variable def
}
}
set foo 1138
proc A {} {
B
}
proc B {} {
set baz 1337
C
}
proc C {} {
upvar #0 foo bar
puts $bar
upvar 1 baz qux
puts $qux
namespace upvar ::abc def ghi
puts $ghi
}