全局变量在TCL源文件之间发生冲突

时间:2016-11-08 13:57:08

标签: global-variables tcl conflicting-libraries

我正在将2个文件存入我的TCL脚本。两者都有一些名称相同但值不同的变量。我要使用这两个文件,我无法修改它们。我怎样才能克服这个问题..?

1 个答案:

答案 0 :(得分:1)

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

使用命名空间分隔脚本

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

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

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

使用口译员分隔脚本

这个方法肯定会将脚本彼此隔离开来,但是处理起来可能会更加尴尬,因为它还会将它们与应用程序的其余部分隔离开来(除非你提供适当的交叉间隔别名) :

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代码而不会暴露很多导致恶作剧的能力。