2012-02-20 97 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