【问题标题】:Alias/Rename a command in Tcl but keep both versions working别名/重命名 Tcl 中的命令,但保持两个版本工作
【发布时间】:2016-08-02 07:41:50
【问题描述】:

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

rename proc func

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

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

proc func { arg } {
  proc $arg
}

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

【问题讨论】:

    标签: tcl


    【解决方案1】:

    您可以使用解释器别名:

    interp alias {} func {} proc
    

    文档: interp

    【讨论】:

      【解决方案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) }]
      

      【讨论】:

      • 感谢您的深入解释和示例,真棒!
      猜你喜欢
      • 2013-04-23
      • 2017-10-04
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2014-11-28
      • 2011-01-25
      相关资源
      最近更新 更多