1

我将 2 个文件采购到我的 TCL 脚本中。两者都有一些名称相同但值不同的变量。我必须使用这两个文件,我不能修改它们。我怎样才能克服这个问题..?

4

1 回答 1

1

立即想到的两个想法是尝试命名空间或解释器。

使用命名空间分隔脚本

在这种情况下,我们只是在做:

namespace eval A {
    source script-a.tcl
}
namespace eval B {
    source script-b.tcl
}

不能保证这些不会冲突——它们没有被强烈分离——但它们可能会起作用。这绝对是一个容易尝试的第一件事,并且创建的变量和过程应该分开。

用解释器分离脚本

这种方法确实将脚本彼此隔离,但使用起来可能更尴尬,因为它还将它们与应用程序的其余部分隔离(除非您提供适当的跨interp别名):

interp create Acontext
interp eval Acontext {
    source script-a.tcl
}
interp create Bcontext
interp eval Bcontext {
    source script-b.tcl
}

正如我上面提到的,默认情况下,这不会让脚本看到主脚本所做的任何事情。围墙几乎是完全的。要授予对主解释器中命令的访问权限,您需要创建一个别名:

proc mainContextOperation {callee args} {
    puts "this is in the main context called from ${callee}: $args"
}
interp alias  Acontext DoMyThing  {} mainContextOperation Acontext
interp alias  Bcontext DoMyThing  {} mainContextOperation Bcontext

source在进行调用之前(但在调用之后)创建这些别名interp create,这些脚本将能够使用该DoMyThing命令写出一条消息,而主上下文将非常清楚发生了什么。

Tcl 使用这种机制作为安全解释器的基础,这就是您如何评估不受信任的 Tcl 代码而不会暴露太多导致恶作剧的能力。

于 2016-11-08T14:28:20.547 回答