【问题标题】:Tcl return vs. last evaluated in proc - internalsTcl return vs. last 在 proc 中评估 - 内部
【发布时间】:2015-05-06 11:11:40
【问题描述】:

当我在 Tcl 中编写一个 proc 时,它的返回值实际上是另一个 proc 的结果,我可以执行以下任一操作(请参阅隐式示例):

proc foo args {
...
...
bar $var1
}

或者我可以这样做(见明确的例子):

proc foo args {
...
...
return [ bar var1 ]
}

从界面的角度来看,即输入与输出,两者是相同的。 它们是内部的吗?
或者隐式与显式返回是否有一些额外的好处? 谢谢。

【问题讨论】:

    标签: return tcl proc


    【解决方案1】:

    在 Tcl 8.6 中,您可以检查字节码以了解这些过程的比较情况。

    如果我们定义一对 'sum' 的实现,然后使用 tcl::unsupported::disassemble 检查它们,我们可以看到是否使用 return 语句会产生相同的字节码。

    % proc sum_a {lhs rhs} {expr {$lhs + $rhs}}
    % proc sum_b {lhs rhs} {return [expr {$lhs + $rhs}]}
    
    % ::tcl::unsupported::disassemble proc sum_a
    ByteCode 0x03C5E8E8, refCt 1, epoch 15, interp 0x01F68CE0 (epoch 15)
      Source "expr {$lhs + $rhs}"
      Cmds 1, src 18, inst 6, litObjs 0, aux 0, stkDepth 2, code/src 0.00
      Proc 0x03CC33C0, refCt 1, args 2, compiled locals 2
          slot 0, scalar, arg, "lhs"
          slot 1, scalar, arg, "rhs"
      Commands 1:
          1: pc 0-4, src 0-17
      Command 1: "expr {$lhs + $rhs}"
        (0) loadScalar1 %v0     # var "lhs"
        (2) loadScalar1 %v1     # var "rhs"
        (4) add 
        (5) done 
    
    % ::tcl::unsupported::disassemble proc sum_b
    ByteCode 0x03CAD140, refCt 1, epoch 15, interp 0x01F68CE0 (epoch 15)
      Source "return [expr {$lhs + $rhs}]"
      Cmds 2, src 27, inst 6, litObjs 0, aux 0, stkDepth 2, code/src 0.00
      Proc 0x03CC4B80, refCt 1, args 2, compiled locals 2
          slot 0, scalar, arg, "lhs"
          slot 1, scalar, arg, "rhs"
      Commands 2:
          1: pc 0-5, src 0-26        2: pc 0-4, src 8-25
      Command 1: "return [expr {$lhs + $rhs}]"
      Command 2: "expr {$lhs + $rhs}"
        (0) loadScalar1 %v0     # var "lhs"
        (2) loadScalar1 %v1     # var "rhs"
        (4) add 
        (5) done 
    

    return 语句实际上只是在记录您打算返回这个值,它不仅仅是一个副作用。使用return 不是必需的,但在我看来是值得推荐的。

    【讨论】:

    • 我使用 Tcl 8.5。但我认为它是一样的。谢谢!
    • disassemble 也在 8.5 中。字节码几乎相同; 8.6 中有一些额外的优化,但都是次要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多