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

많은 감사에서 추가 비트를 수정했습니다. 당신은 해결책은 pratically 완벽합니다! 마지막 물건. 네임 스페이스 앙상블을 만들려고합니다. ' package ifneeded를 사용하고 있습니다. Package :: part1 1.0 [list source [file join $ dir part1.tcl]] 패키지 ifneeded Package :: part2 1.0 [list source [file join $ dir part2.tcl]] package ifneeded 패키지 1.0 [list source [file join $ dir package.tcl]; \ namespace eval {namespace ensamble create}; \ package 제공 0.1]'그러나 작동하지 않습니다. (앙상블이 작동하지 않는다는 뜻입니다) . 첫 번째 패키지의 proc 만 하위 명령으로 인식합니다. –

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

관련 문제