2014-09-25 64 views
4

帧和执行级别之间的区别是什么?Tcl:[信息级别]与[信息帧]

我写了一个小例子来找出答案。我意识到每次调用proc时级数都会增加。

在另一方面,帧数递增每

  • PROC呼叫
  • 源命令
  • eval命令

为此,我开始将水平视为框架的一个子集。现在我正在调试一些实际的代码,并且我意识到级数可以增加而不增加帧数。如何理解这个东西?

回答

4

堆栈的水平,这是怎么样info level会谈,是重要的,因为他们可以使用upvaruplevel访问到的。这意味着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报告甚至更​​多信息。)