Tcl脚本:执行proc主体时返回无效的命令名称

时间:2014-11-27 09:59:40

标签: return tcl catch-block

在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]可以正常工作。我最初的想法是,它们都是可交换的,应该提供相同的输出。那么,为什么第一个给出错误,两者之间有什么区别呢?

1 个答案:

答案 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的定义而不进行评估。