如何在 TCL 解释器中检索最后一个命令的 return 值?

How to retrieve the last command's return value in TCL interpreter?

在 Tcl 中,如果我计算一个命令,而我的表达式未能将结果存储在变量中,除了重新计算命令之外,有没有办法在 TCL 中检索最后一个命令的 return 值口译员?比如有些lisp中,变量*绑定上次求值的结果,TCL中有没有类似的东西?

For example, in some lisps, the variable * is bound to the result of the last evaluation, is there something like that in TCL?

视情况而定,但在非错误情况下,catch 可用于捕获随附脚本中最后一次成功评估的结果:

proc foo {} {return FOO}
proc bar {} {return BAR}

if {![catch {
    if {rand() < 0.5} {foo} else {bar}
} * opts]} {
    # handle result of last cmd evaluation
    puts ${*}
} else {
    # handle an error
    puts [dict get $opts -errorinfo]
}

如果您碰巧事先知道命令名称,command traces 可能是另一种选择。

Tcl 解释器循环 — 非常简单,几乎没有隐藏的功能 — 不会 为您保存最后的结果值;它假设如果你想保存它以备后用,你将手动保存(或者你将重复命令并重新获得结果以便你可以保存它)。

如果您想保存一个值供以后使用,请使用 set。您可以使用 * 作为变量的名称(这是合法的),但在实践中它很烦人,因为 $var 语法快捷方式不适用于它,而您需要这样做:

% set * [expr {2**2**2**2}]; # Or whatever...
65536
% puts "the value was ${*}... this time!"
the value was 65536... this time!
% puts "an alternative is to do [set *]"
an alternative is to do 65536

这在打字时可能会有点烦人;请改用 it 之类的名称。

% set it [expr {2**2**2**2}]; # Or whatever...
65536
% puts [string length [expr {123 << $it}]]
19731

(最后那个数字的位数有点多,比我想象的要多……)