Tcl return 与最后一次在 proc 中评估 - 内部

Tcl return vs. last evaluated in proc - internals

当我在 Tcl 中编写一个过程时,return 值实际上是另一个过程的结果,我可以执行以下任一操作(参见隐式示例):

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

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

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

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

在 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 这个值,它不仅仅是副作用。使用 return 不是必需的,但我认为建议使用。