在Tcl脚本中,我想捕获Tcl proc的返回以执行一些终结操作。 例如,我的代码可以如下:
proc X10 { a } { return [expr $a * 10] }
proc procF {} {
set a 13
catch {[info body X10]} __result
return $__result
}
procF
之前的代码给出了一个错误:invalid command name " return [expr $a * 10] "
虽然用info body X10
替换return [expr $a * 10]
可以正常工作。我最初的想法是,它们都是可交换的,应该提供相同的输出。那么,为什么第一个给出错误,两者之间有什么区别呢?
答案 0 :(得分:1)
您的代码失败了,因为您正在获取X10
的正文并将其视为命令名称。 Tcl不会为你自动拆分 - 你必须询问 - 这是一个重要的语言安全因素。你必须做这样的事情:
proc procF {} {
set a 13
catch {eval [info body X10]} __result
return __result
}
或者这个(因为catch
的第一个参数是脚本):
proc procF {} {
set a 13
catch [info body X10] __result
return __result
}
但我实际上倾向于你的情况(如准确呈现,并试图解释你所说的):
proc procF {} {
set a 13
catch {X10 $a} __result
return __result
}
另请注意,如果您这样做:
proc procF {} {
set a 13
catch {info body X10} __result
return __result
}
然后结果将是X10
的定义而不进行评估。