首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tcl:命名空间eval中的命名空间导入

Tcl:命名空间eval中的命名空间导入
EN

Stack Overflow用户
提问于 2014-10-05 11:24:50
回答 1查看 1.4K关注 0票数 1

我的Tcl项目库组织在如下树中:

mylib :基本文件夹(有一些Tcl)文件

mylib/foo、mylib/bar (带有其他一些Tcl文件的子目录)。

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

代码语言:javascript
复制
# 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和使用包mc:

代码语言:javascript
复制
# file by.tcl
package require mc
namespace eval ::by {}
proc ::by::execute {} {
    ::mc::dance&sing "Sushi&more"
}
package provide by 1.1

到目前为止,一切都像广告一样运作。现在,我希望(作为练习)通过导入从:mc导出的符号来更改by.tcl。这是我的零钱:

代码语言:javascript
复制
namespace eval ::by {
    namespace import ::mc::dance&sing
}

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

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

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

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

下面是您如何复制它:

(1)下载http://files.ronaldf.eml.cc/stovfl0.tgz并将其解压缩到某个目录(2),确保bash (或zsh)和tclsh在您的路径(3) cd中,您已将所有内容解压缩到该目录,并按如下方式运行:

代码语言:javascript
复制
bash ./run-it.sh

您应该会看到类似于以下内容的输出:

代码语言:javascript
复制
pkg_mkIndex for directory ....stovfl0/mylib/foo
pkg_mkIndex for directory ....stovfl0/mylib/bar

(4) cat mylib/bar/pkgIndex.tcl

你会注意到,那个包裹“by”不见了。

EN

回答 1

Stack Overflow用户

发布于 2014-10-06 10:23:34

不管出了什么问题都是很神秘的。当我在一个新的空目录中创建以下两个文件时:

代码语言:javascript
复制
# mc.tcl
namespace eval ::mc {
    namespace export dance&sing
}
proc ::mc::dance&sing { {s {Oh Tannenbaum} } } { puts "$s,...." }
package provide mc 1.4
代码语言:javascript
复制
# 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 (雪豹系统构建)进入该目录,并发出以下Tcl命令:

代码语言:javascript
复制
pkg_mkIndex . *.tcl

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

代码语言:javascript
复制
# 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]]

当我使用TCL8.4或TCL8.6时,我得到了完全相同的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26202155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档