幀和執行級別之間的區別是什麼?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
報告甚至更多信息。)