帧和执行级别之间的区别是什么?Tcl:[信息级别]与[信息帧]
我写了一个小例子来找出答案。我意识到每次调用proc时级数都会增加。
在另一方面,帧数递增每
- PROC呼叫
- 源命令
- eval命令
- 等
为此,我开始将水平视为框架的一个子集。现在我正在调试一些实际的代码,并且我意识到级数可以增加而不增加帧数。如何理解这个东西?
帧和执行级别之间的区别是什么?Tcl:[信息级别]与[信息帧]
我写了一个小例子来找出答案。我意识到每次调用proc时级数都会增加。
在另一方面,帧数递增每
为此,我开始将水平视为框架的一个子集。现在我正在调试一些实际的代码,并且我意识到级数可以增加而不增加帧数。如何理解这个东西?
堆栈的水平,这是怎么样info level
会谈,是重要的,因为他们可以使用upvar
和uplevel
访问到的。这意味着Tcl“堆栈”是真的是树,因为你可以使用uplevel
上升到一个更高的级别并开始一个新的分支,每一步更深入的调用一个程序(或类似程序东西)或致电namespace eval
; info level
命令真的谈到当前分支追溯到根目录。
的info frame
命令帧走的树,而不同 - 我认为它使用它们被堆放在实际方式,帧能够出现两次 - 约每这些帧的报告非常不同的信息。就我个人而言,我只能真正发现它对调试很有用。
让我们试试简单的例子。这是一个交互式会话。
% proc foo {y} {set x 1;bar $y $x $y}
% proc bar {a b args} {
puts [info level 0]
puts [info level -1]
puts [info frame 0]
puts [info frame -1]
}
% foo 3
bar 3 1 3
foo 3
type proc line 4 cmd {info frame 0} proc ::bar level 0
type proc line 1 cmd {bar $y $x $y} proc ::foo level 1
OK,你可以看到,info level
是报告中使用,并且不会报告本身的实际值,而info frame
是报告什么水平目前正在做的事情。
下面是一个更复杂的例子:
% proc foo {y} {set x 1;grill $y $x $y}
% proc grill {a b c} {uplevel 1 [list bar $a $b $c]}
% proc bar {args} {
for {set i 1} {$i<=[info level]} {incr i} {puts $i-->[info level $i]}
for {set i 1} {$i<=[info frame]} {incr i} {puts $i==>[info frame $i]}
}
% foo 3
1-->foo 3
2-->bar 3 1 3
1==>type eval line 1 cmd {foo 3} level 2
2==>type proc line 1 cmd {grill $y $x $y} proc ::foo level 1
3==>type proc line 1 cmd {uplevel 1 [list bar $a $b $c]} proc ::grill
4==>type eval line 1 cmd {bar 3 1 3} proc ::grill
5==>type proc line 3 cmd {info frame $i} proc ::bar level 0
正如你所看到的,info level
没有看到的uplevel
发生过,但info frame
确实。但只有info level
可以真正告诉你什么是论据。 (请注意,如果您将代码放在一个文件中,那么您的source
,info frame
报告甚至更多信息。)