gpt4 book ai didi

Tcl:[信息级别] vs. [信息框架]

转载 作者:行者123 更新时间:2023-12-04 02:51:14 25 4
gpt4 key购买 nike

框架和执行级别之间有什么区别?

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

另一方面,帧号每增加一次

  • 过程调用
  • 源命令
  • 评估命令

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

    最佳答案

    堆栈级别,这是什么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真的可以告诉你论据是什么。 (请注意,如果您将代码放在一个文件中,您 sourceinfo frame 会报告更多信息。)

    关于Tcl:[信息级别] vs. [信息框架],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26041783/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com