如何在 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
(最后那个数字的位数有点多,比我想象的要多……)
在 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
(最后那个数字的位数有点多,比我想象的要多……)