2014-09-25 62 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報告甚至更​​多信息。)