TCL命名空间和源代码

时间:2013-06-06 16:38:41

标签: namespaces tcl

我有两个文件:main.tcl和paths.tcl。
main.tcl:

set p "paths.tcl"
puts $p
if {[lindex $argv 0]} {
    source $::p
    puts $::techDir
}
namespace eval ::newWkSpace {
    source $::p
}
puts $::newWkSpace::techDir

paths.tcl:

set techDir ../tech

我做了两次试验:

$ tclsh main.tcl 0
paths.tcl
../tech
$ tclsh main.tcl 1
paths.tcl
../tech
can't read "::newWkSpace::techDir": no such variable
    while executing
"puts $::newWkSpace::techDir"
    (file "main.tcl" line 11)

有人可以解释错误,以及为什么在第一次试用中没有发生错误? (这是tcl 8.5)

1 个答案:

答案 0 :(得分:3)

我想在你的第二个测试案例中,当intertter执行时

namespace eval ::newWkSpace {
    source $::p
}

然后来执行

set techDir ../tech

它注意到:: techDir已存在,它被分配到那里并且没有在newWkSpace命名空间中创建一个techDir变量。

出现的问题是,"你为什么这样做?"。如果你真的想让它工作,那么在你输出paths.tcl之前尝试在你的命名空间中加一个variable techDir语句,这样:

namespace eval newWkSpace {
    variable techDir;   #<<<<<<<<<<<
    source $::p
}

我希望那些真正了解Tcl的人会在一段时间内让我正确并给你一个正确的答案。