我有一系列Tcl脚本正在翻译中执行(Cadence Innovus)。我想要一种分组命令并通过一次调用执行它们的方法。从功能上讲,我可以通过在一个单独的文件中编写每组命令并调用source <group_file_name>
来实现这一目的。但是,定义这么多文件是不方便的。
我试过这样做:
proc {} {
commands...
}
这并没有给我我需要的功能。我相信它在较低的命名空间中执行命令,并且不会保留设置的变量。
有没有办法获得此功能(具有可调用函数的单个文件),但是在同一名称空间中执行?
答案 0 :(得分:1)
嗯,您始终可以在该过程中使用uplevel
或namespace eval
来更改当前的命名空间。如果您使用uplevel
,则可以执行此操作:
proc foo {} {
uplevel 1 {
TheFirstCommand
TheSecondCommand
TheThirdCommand
}
}
使用namespace eval
,您可以改为执行此操作:
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
几乎是替代品。