Tcl:名称空间eval中的名称空间导入

时间:2014-10-05 11:24:51

标签: tcl

我的Tcl项目库按照这样的树组织:

mylib:基本文件夹(有一些Tcl)文件
mylib / foo,mylib / bar(包含其他一些Tcl文件的子目录)。

特别是,我有mylib / foo / mc.tcl,提供名为的包mc

# File mc.tcl
namespace eval ::mc {
    namespace export dance&sing
}
proc ::mc::dance&sing { {s {Oh Tannenbaum} } } { puts "$s,...." }
package provide mc 1.4

运作良好。现在我添加了mylib / bar / by.tcl,提供了一个命名空间:by和using mc:

# file by.tcl
package require mc
namespace eval ::by {}
proc ::by::execute {} {
    ::mc::dance&sing "Sushi&more"
}
package provide by 1.1

到目前为止,一切都像广告一样有效。现在,我希望(作为练习)通过从以下位置导入导出的符号来改变by.tcl。这是我的改变:

namespace eval ::by {
    namespace import ::mc::dance&sing
}

当通过pkg_mkIndex运行修改后的文件时,我发现生成的pkgIndex.tcl不包含包的条目,这通常表示tcl文件中存在一些错误。但是,我可以执行by.tcl而不会收到错误消息。如果我的设计中存在错误,则必须更加微妙。

我的TCLLIBPATH环境变量只包含基本文件夹mylib(当然是绝对路径)。这应该不是问题,因为递归地找到包的文件。

知道这里出了什么问题吗?

我添加了一个重现问题的例子

以下是如何重现它:

(1)下载http://files.ronaldf.eml.cc/stovfl0.tgz并将其解压缩到某个目录 (2)确保bash(或zsh)和tclsh在你的PATH中 (3)cd进入你已经解压缩所有内容的目录,然后像这样运行:

bash ./run-it.sh

您应该看到类似于此的输出:

pkg_mkIndex for directory ....stovfl0/mylib/foo
pkg_mkIndex for directory ....stovfl0/mylib/bar

(4)cat mylib / bar / pkgIndex.tcl

你会注意到,该包裹是由'不见了。

1 个答案:

答案 0 :(得分:1)

出现什么问题是非常神秘的。当我在一个新的空目录中创建以下两个文件时:

# mc.tcl
namespace eval ::mc {
    namespace export dance&sing
}
proc ::mc::dance&sing { {s {Oh Tannenbaum} } } { puts "$s,...." }
package provide mc 1.4
# by.tcl
package require mc
namespace eval ::by {}
proc ::by::execute {} {
    namespace import ::mc::dance&sing
    ::mc::dance&sing "Sushi&more"
}
package provide by 1.1

然后我使用tclsh8.5(Snow Leopard系统版本)进入该目录,并发出此Tcl命令:

pkg_mkIndex . *.tcl

然后我创建了这个包索引文件,它是正确的

# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded by 1.1 [list source [file join $dir by.tcl]]
package ifneeded mc 1.4 [list source [file join $dir mc.tcl]]

当我使用Tcl 8.4或Tcl 8.6时,我得到完全相同的