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

别名/重命名Tcl中的命令,但保持两个版本都工作,tcl,Tcl,我的目标是将proc别名/重命名为func,但保持两个版本都工作。 这就是为什么tcl内置的重命名命令不是一个选项,因为当我 rename proc func proc停止工作。当proc不起作用时,像tk_getOpenFile这样的内置命令不起作用 可能的解决方案是构建这样的包装器 proc func { arg } { proc $arg } 上述方法不起作用,因为我是初学者,不知道自己在做什么,但理论上,包装器应该是一个有效的解决方案。 此外,当我学习如何执行上述操作时,我还将尝

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

rename proc func
proc停止工作。当proc不起作用时,像tk_getOpenFile这样的内置命令不起作用

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

proc func { arg } {
  proc $arg
}
上述方法不起作用,因为我是初学者,不知道自己在做什么,但理论上,包装器应该是一个有效的解决方案。

此外,当我学习如何执行上述操作时,我还将尝试将puts重命名为print,并保持两个版本都正常工作。

您可以使用解释器别名:

interp alias {} func {} proc
文件:
您可以使用解释器别名:

interp alias {} func {} proc
文件:
别名是常见的答案。但是,在Tcl 8.6中,您也可以使用
tailcall

proc func {name arguments body} {
    tailcall proc $name $arguments $body
}
在此之前,正确的调用是这样的(假定
proc
始终返回空字符串):

为什么
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) }]

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

proc func {name arguments body} {
    tailcall proc $name $arguments $body
}
在此之前,正确的调用是这样的(假定
proc
始终返回空字符串):

为什么
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) }]

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