我的目标是将 proc 别名/重命名为 func ,但保持两个版本正常运行。 这就是为什么tcl的内置重命名命令不是一个选项,因为当我
rename proc func
proc 停止工作。当 proc 无效时, tk_getOpenFile 等内置命令无效。
可能的解决方案是构建一个像这样的包装器
proc func { arg } {
proc $arg
}
上述方法不起作用,因为我是初学者而且我不知道我在做什么,但理论上包装器应该是一个有效的解决方案。
此外,当我学习如何进行上述操作时,我还会尝试将 puts 重命名为打印并保持两个版本都正常工作。
答案 0 :(得分:2)
答案 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) }]