Tcl中的source的函数等价物是什么?

Tcl中的source的函数等价物是什么?,tcl,Tcl,我有一系列的Tcl脚本正在解释器(Cadence Innovus)中执行。我想要一种将命令分组并通过单个调用执行它们的方法。从功能上讲,我可以通过将每组命令写入一个单独的文件并调用source来实现这一点。但是,定义这么多文件很不方便 我已尝试通过以下方式实现这一点: proc {} { commands... } 但这并没有给我所需要的功能。我相信它在较低的名称空间中执行命令,并且设置的变量不会保留 有没有一种方法可以获取此功能(具有可调用函数的单个文件),但这些功能在同一命名空间中

我有一系列的Tcl脚本正在解释器(Cadence Innovus)中执行。我想要一种将命令分组并通过单个调用执行它们的方法。从功能上讲,我可以通过将每组命令写入一个单独的文件并调用
source
来实现这一点。但是,定义这么多文件很不方便

我已尝试通过以下方式实现这一点:

proc {} {
    commands...
}
但这并没有给我所需要的功能。我相信它在较低的名称空间中执行命令,并且设置的变量不会保留


有没有一种方法可以获取此功能(具有可调用函数的单个文件),但这些功能在同一命名空间中执行?

好的,您可以在该过程中始终使用
uplevel
namespace eval
来更改当前命名空间。如果使用
uplevel
,您将执行以下操作:

proc foo {} {
    uplevel 1 {
        TheFirstCommand
        TheSecondCommand
        TheThirdCommand
    }
}
proc foo {} {
    namespace eval ::theTargetNamespace {
        TheFirstCommand
        TheSecondCommand
        TheThirdCommand
    }
}
使用
namespace eval
,您可以执行以下操作:

proc foo {} {
    uplevel 1 {
        TheFirstCommand
        TheSecondCommand
        TheThirdCommand
    }
}
proc foo {} {
    namespace eval ::theTargetNamespace {
        TheFirstCommand
        TheSecondCommand
        TheThirdCommand
    }
}
如果您想将局部变量与范围更改器一起使用,事情会变得更复杂一些,但是无论您使用哪种机制,如何管理事情的原则都是相同的

proc foo {} {
    set a [uplevel 1 { TheFirstCommand }]
    set b [uplevel 1 { TheSecondCommand }]
    # Dynamically-generate the script to run; it's trivial code generation
    uplevel 1 [list TheThirdCommand $a $b]
}
切换到
namespace eval
几乎是替代品