别名/重命名Tcl中的命令,但保持两个版本都有效

时间:2016-08-02 07:41:50

标签: tcl

我的目标是将 proc 别名/重命名为 func ,但保持两个版本正常运行。 这就是为什么tcl的内置重命名命令不是一个选项,因为当我

rename proc func

proc 停止工作。当 proc 无效时, tk_getOpenFile 等内置命令无效。

可能的解决方案是构建一个像这样的包装器

proc func { arg } {
  proc $arg
}

上述方法不起作用,因为我是初学者而且我不知道我在做什么,但理论上包装器应该是一个有效的解决方案。
此外,当我学习如何进行上述操作时,我还会尝试将 puts 重命名为打印并保持两个版本都正常工作。

2 个答案:

答案 0 :(得分:2)

您可以使用解释器别名:

interp alias {} func {} proc

文档: interp

答案 1 :(得分:2)

别名是通常的答案。但是,在Tcl 8.6中,您还可以使用tailcall

proc func {name arguments body} {
    tailcall proc $name $arguments $body
}

在此之前,正确的调用是这样的(假设proc总是返回空字符串):

proc func {name arguments body} {
    uplevel 1 [list proc $name $arguments $body]
}

为什么uplevel?因为name未引用完全限定名称时当前命名空间的重要性;在调用者的上下文中进行评估会使事情“不足为奇”。 (tailcall版本也处理此权利。)

尽管如此,我实际上更喜欢在我的程序中定义func

proc func {name arguments body} {
    tailcall proc tcl::mathfunc::$name $arguments [list expr $body]
}

为什么呢?因为那时“只是有效”:

func cube x {
    $x ** 3
}

set num [expr { cube(17) }]