Tcl:[info level] vs. [info frame]

时间:2014-09-25 14:58:04

标签: tcl

帧与执行级别有什么区别?

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

另一方面,帧数在每个

上递增
  • proc call
  • 源命令
  • eval命令

出于这个原因,我开始将级别视为帧的子集。现在我正在调试一些现实代码,我意识到级别数可以增加,而帧数也不会增加。如何理解这些东西?

1 个答案:

答案 0 :(得分:5)

堆栈级别是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

好的,正如您所看到的,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会报告更多信息。)