2012-07-29 37 views
0

在Incr Tcl中,通過更改並重新評估類的方法爲正在運行的Tcl解釋器而無需重新啓動應用程序,我可以獲得編程生產力的提高。爲此,我必須使用body語法定義類定義之外的方法,並將正文定義重新評估爲正在運行的Tcl解釋器。這工作正常。令人驚訝的是,顯然在設計上,在Incr Tcl如何向[incr-tcl]中的類動態添加方法

一個類只能定義一次,雖然類方法 和特效的機構可以爲交互式調試一次又一次地定義。

然而,在開發過程中,我將方法(重構)分解爲兩個或多個要在同一個類中定義的其他方法。

我想找到一種方法,這樣的方法,正在運行的Tcl解釋強行添加到現有的類:

  1. 沒有刪除和重新eval'ing類定義成運行Tcl解釋,
  2. 如果不重新啓動包含要擴充的Incr Tcl類的現有對象實例的Tcl應用程序,並且沒有從所述Tcl解釋器中刪除現有對象的結果。

我只需要這個作爲開發/調試儀式,而不是生產代碼(即,我不需要以編程方式動態添加方法)。我會接受粘性,邪惡,後門的答案。更改Incr Tcl的生產副本以添加其他行爲是不現實的,因爲我不得不使用Incr Tcl的二進制文件,它不幸被靜態綁定到正在運行的進程中,並且無法通過某些共享庫巫術來卸載和重新加載。

回答

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,兩者完全支持創建後重新配置類。

+0

謝謝Donal。我現在只能忍受這個限制,因爲在短期內不可能遷移到TclOO。 (不要將你的答案標記爲已接受的答案,因爲也許有人可能會回來的方式來做到這一點)。 – bgoodr 2012-07-30 16:08:44