Tcl - разделить пространство имен и упаковать в несколько файлов - PullRequest
2 голосов
/ 21 февраля 2012

Я новичок в 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 ]

6 голосов
/ 21 февраля 2012

Я бы использовал файл 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).

0 голосов
/ 21 февраля 2012

Я решил. Второе решение патойц идеально.

Я немного его изменил, добавив

<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"

Большое спасибо

...