2016-08-02 36 views
0

我的目标是别名/重命名PROCFUNC但保留两个版本的工作。 这就是为什么TCL的内置重命名命令不是一个选项,因为当我别名/重命名的Tcl命令,但保留两个版本的工作

rename proc func 

PROC停止工作。并且当proc不工作内置命令如tk_getOpenFile does not工作。

可能的解决办法是建立这样

proc func { arg } { 
    proc $arg 
} 

以上简化版,工作的包装,因为我是一个初学者,我不知道我在做什么,但在理论上的包装应成为有效的解决方案。
另外,当我学习如何做到上述我也会尝试重命名打印并保持两个版本的工作。

回答

2

您可以使用翻译别名:

interp alias {} func {} proc 

文档: interp

+0

非常感谢你这工作完全<3 –

2

别名是通常的回答。然而,在Tcl的8.6,你也可以使用tailcall

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

此前,右invokation会是这样(因为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) }] 
+0

感谢深入的解释和例子,真棒工作! –