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

如何在[incr tcl]中向类动态添加方法,tcl,redefinition,incr-tcl,Tcl,Redefinition,Incr Tcl,在Incr-Tcl中,我通过更改类的方法,然后将其重新评估为运行中的Tcl解释器,而无需重新启动应用程序,从而提高了编程效率。为此,我必须使用语法定义类定义之外的方法,并将主体定义重新评估到正在运行的Tcl解释器中。那很好。令人惊讶的是,显然是有意的 一个类只能定义一次,尽管类方法的主体 可以一次又一次地定义进程以进行交互式调试 当然,在开发过程中,我会将方法(重构)拆分为两个或多个附加方法,以便在同一个类中定义 我想找到一种方法,在运行的Tcl解释器中强制向现有类添加方法: 在不删除类定义并将

在Incr-Tcl中,我通过更改类的方法,然后将其重新评估为运行中的Tcl解释器,而无需重新启动应用程序,从而提高了编程效率。为此,我必须使用语法定义类定义之外的方法,并将主体定义重新评估到正在运行的Tcl解释器中。那很好。令人惊讶的是,显然是有意的

一个类只能定义一次,尽管类方法的主体 可以一次又一次地定义进程以进行交互式调试

当然,在开发过程中,我会将方法(重构)拆分为两个或多个附加方法,以便在同一个类中定义

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

  • 在不删除类定义并将其重新评估到正在运行的Tcl解释器中的情况下
  • 不重新启动包含要扩充的Incr Tcl类的现有对象实例的Tcl应用程序,以及
  • 没有从所述Tcl解释器中删除现有对象的结果
  • 我只需要将此作为开发/调试惯例,而不需要用于生产代码(即,我不需要以编程方式动态添加方法)。我会接受卑鄙、邪恶、秘密的回答。更改Incr Tcl的生产副本以添加其他行为是不实际的,因为我必须使用的Incr Tcl的二进制文件不幸地静态绑定到正在运行的进程中,并且不能通过一些共享库巫术卸载和重新加载。

    您可以在类中重新定义一个方法,方法如下:

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

    %包装要求Itcl 3.4 %itcl::hi类{ #这里除了我们这些小鸡没人。。。 } %嗨嗨 你好 %itcl::body hi::那里{}{放上“你好!” 类中未定义函数“there”::hi

    如果您需要这种功能,您可以考虑使用XOTCL或(从TCL 8.5开始)TCROO,这两个都支持创建后类的完全重新配置。我现在只能接受这个限制,因为短期内不可能迁移到TclOO。(不要将您的答案标记为已接受的答案,因为可能有人会带着一种方法回来)。

    itcl::body helloworld::greet {} {
        puts "Goodbye Cruel World from $owner"
    }
    
    % 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"