Tcl - 将命名空间和包拆分为多个文件

时间:2012-02-20 20:39:52

标签: namespaces package tcl

我是tcl / tk的初学者。我正在尝试使用命名空间集合创建一个包。

我的想法是创建一组文件以简化项目管理,例如<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 { ... } {

...

}

它不起作用。

我很感激任何建议。

非常感谢

2 个答案:

答案 0 :(得分:6)

我会使用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]]

如果子组件可能本身有用,或者仅将某些部件加载到interp中可能很方便,则此模型非常有用。 tcllib SASL包用于避免默认加载某些机制(例如NTLM)。

答案 1 :(得分: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"

非常感谢