2012-02-20 51 views
2

我是tcl/tk的初學者。我正在嘗試使用名稱空間集合來創建一個包。Tcl - 將命名空間和包分割成幾個文件

我的想法是創建一組文件,以保持它的簡單管理項目,像<name_package>-<name_procedure>.tcl

願你解釋我如何在包內拆分命名空間合奏成幾個文件?

我想做創建一個包含

package provide <name> 0.1 

namespace eval <namespace> { 

namespace export proc1 proc2 proc3 ... 
namespace ensemble create 

} 

一個文件,包含程序

package provide <name> 0.1 

proc ::<namespace>::proc { ... } { 

... 

} 

它不工作的文件。

我很感激任何建議。

非常感謝

回答

5

我會用pkgIndex文件源中的所有組成文件你的包。這將加載所有東西。然後在解釋器加載完所有內容後宣佈合奏。

package ifneeded Mypackage 1.2.3 \ 
    "source \[file join [list $dir] pkg-part1.tcl\] ; \ 
    source \[file join [list $dir] pkg-part2.tcl\] ; \ 
    namespace ensemble create {...} ; \ 
    package provide Mypackage 1.2.3" 

不要在每個子組件中「提供」。一旦所有東西都被成功加載到解釋器中,最好提供這個包,所以我會在文件的末尾做這件事,或者在這種情況下,最後加載全套。如果您真的想將每個部分視爲一個子包,那麼沒有理由不將它們聲明爲子包,並且需要每個子包的主包。例如:

<main package> 
    package require Package::part1 
    package require Package::part2 
    package provide Package 1.0 

<subpackage files> 
    namespace eval Package { 
    ... stuff ... 
    } 
    ... more stuff ... 
    package provide Package::partN 1.0 

<pkgIndex.tcl> 
    package ifneeded Package::part1 1.0 [list source [file join $dir part1.tcl]] 
    package ifneeded Package::part2 1.0 [list source [file join $dir part2.tcl]] 
    package ifneeded Package 1.0 [list source [file join $dir package.tcl]] 

這種模式可能是有用的,如果子組件可能是對自己有幫助的,或者它可能是很方便的只有某些部分加載到插補。 tcllib SASL軟件包可以避免在默認情況下加載某些機制(例如NTLM)。

+0

非常感謝。你的解決方案非常完美!只是最後一件事。我仍然試圖創建一個命名空間集合。我將'包放在需要的地方Package :: part1 1.0 [list source [file join $ dir part1.tcl]] package ifneeded Package :: part2 1.0 [list source [file join $ dir part2.tcl]] package ifneeded Package 1.0 [list source [file join $ dir package.tcl]; \ namespace eval {namespace ensamble create}; \ package provides 0.1]'但它不起作用(我的意思是整體不起作用) 。它僅將第一個包中的proc識別爲子命令。 – 2012-02-21 11:44:39

0

我解決了。 patthoyts的第二個解決方案是完美的。

我修改了一點加入

<subpackage files> 
    namespace eval Package { 
    namespace export <proc_name> 
    } 
    ... more stuff ... 
    package provide Package::partN 1.0 

,並在

<pkgIndex.tcl> 
    package ifneeded Package::part1 1.0 [list source [file join $dir part1.tcl]] 
    package ifneeded Package::part2 1.0 [list source [file join $dir part2.tcl]] 
    package ifneeded Package 1.0 "[list source [file join $dir package.tcl]];\ 
           namespace eval <package> {namespace ensemble create};\ 
           package provide <package> 0.1" 

很多很多的感謝

+0

請修正您的示例:將'ensamble'替換爲'ensemble'。另外請務必將Pat的答案標記爲已接受。 – kostix 2012-02-22 07:43:46