Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Namespaces TCL名称空间和堆栈框架之间有什么区别?_Namespaces_Tcl_Callstack_Upvar_Uplevel - Fatal编程技术网

Namespaces TCL名称空间和堆栈框架之间有什么区别?

Namespaces TCL名称空间和堆栈框架之间有什么区别?,namespaces,tcl,callstack,upvar,uplevel,Namespaces,Tcl,Callstack,Upvar,Uplevel,Upvar创建指向中变量的链接,有时称为a或a Upvar还用于为全局(或命名空间)变量创建别名。但名称空间仅由命令创建。proc命令将创建一个新的堆栈帧 名称空间和调用堆栈似乎是可以更改的两种方式。Upvar和Uplevel可以在名称空间和调用堆栈上工作 我做对了吗?我还没有看到调用堆栈和名称空间之间的直接比较,因此我的问题是。不,不完全是。名称空间和调用框架是非常不同的概念。名称空间是名称的层次结构,可以消除同义词的歧义。程序中可能有三个名为foo的变量,但如果将它们放在不同的名称空间中,它

Upvar创建指向中变量的链接,有时称为a或a

Upvar还用于为全局(或命名空间)变量创建别名。但名称空间仅由命令创建。proc命令将创建一个新的堆栈帧

名称空间和调用堆栈似乎是可以更改的两种方式。Upvar和Uplevel可以在名称空间和调用堆栈上工作


我做对了吗?我还没有看到调用堆栈和名称空间之间的直接比较,因此我的问题是。

不,不完全是。名称空间和调用框架是非常不同的概念。名称空间是名称的层次结构,可以消除同义词的歧义。程序中可能有三个名为
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
}