如何在[incr-tcl]中向类动态添加方法

时间:2012-07-29 02:45:20

标签: tcl redefinition incr-tcl

在Incr Tcl中,通过更改然后将类的方法重新评估为正在运行的Tcl解释器,我获得了编程效率的提升,而无需重新启动应用程序。为此,我必须使用body语法在类定义之外定义方法,并将正文定义重新计算为正在运行的Tcl解释器。这很好。令人惊讶的是,显然是出于设计,在Incr Tcl

  

一个类只能定义一次,尽管是类方法的主体   和procs可以反复定义以进行交互式调试。

然而,在开发过程中,我正在将方法(重构)拆分为两个或更多要在同一个类中定义的其他方法。

我想找到一种方法来强制将方法添加到正在运行的Tcl解释器中的现有类中:

  1. 不删除并重新评估类定义到正在运行的Tcl解释器,
  2. 无需重新启动包含要扩充的Incr Tcl类的现有对象实例的Tcl应用程序,并且
  3. 没有结果从现有的Tcl解释器中删除现有对象。
  4. 我只需将其作为开发/调试仪式,而不是生产代码(即,我不需要以编程方式动态添加方法)。我会接受粘糊糊,邪恶的后门答案。更改Incr Tcl的生产副本以添加其他行为是不切实际的,因为不幸的是,Incr Tcl I必须使用的二进制文件静态地绑定到正在运行的进程中,并且无法通过某些共享库巫术来卸载和重新加载。 / p>

1 个答案:

答案 0 :(得分:2)

您可以使用itcl::body 重新定义类中的方法:

itcl::body helloworld::greet {} {
    puts "Goodbye Cruel World from $owner"
}

但是,您不能以这种方式向类中添加全新方法。好吧,当然不是3.4(我没有用4.0测试过):

% package require Itcl
3.4
% itcl::class hi {
    # Nobody in here but us chickens...
}
% hi Hi
Hi
% itcl::body hi::there {} {puts "Howdy!"}
function "there" is not defined in class "::hi"

如果您需要这种功能,可以考虑使用XOTcl或(从Tcl 8.5开始)TclOO,它们都支持在创建后完全重新配置类。