1

在 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 X10return [expr $a * 10]预期的工作。我最初的想法是它们都是可交换的,并且应该提供相同的输出。那么,为什么第一个给出错误,它们之间有什么区别?

4

1 回答 1

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没有被评估的定义。

于 2014-11-27T10:19:30.403 回答