提问人:JoshTitle 提问时间:11/15/2023 最后编辑:mrcalvinJoshTitle 更新时间:11/15/2023 访问量:56
Tcl变量在不同的命名空间中交互,如何修复
Tcl variable interact in different namespace, how to fix
问:
在 tcl 中,我需要获取一些文件,file1、file2、file3,....fileN,我为每个文件创建每个命名空间,但是每个命名空间中设置的 var 会影响其他命名空间的 var
以下是我的代码:
proc source_file { args } {
global i
namespace eval NC{$i} {
uplevel #0 [list source [uplevel 1 {set args}]]
}
incr i
}
set i 1
set A 123
source_file file1.tcl
source_file file2.tcl
file1.tcl:
set A 456;
puts $A
文件2.tcl:
puts $A
我希望 file2.tcl 的 put 会打印 123,但它打印 456,我的代码错误是什么?
答:
1赞
Donal Fellows
11/15/2023
#1
uplevel #0
几乎和做一样;code 参数在全局命名空间中运行。(区别在于他们如何管理堆栈;大多数代码不会关心这种差异。这意味着这两个文件都在同一个命名空间(全局命名空间)中运行。namespace eval ::
在 Tcl 8 中,您需要该文件正确地表示:
variable A 456
puts $A
若要使变量位于正确的命名空间中,需要使用以下命令调用该文件:
uplevel "#0" [list namespace eval $ns [list source $filename]]
# I put #0 in quotes just to defeat the syntax highlighter here
当然,假设您将命名空间和文件名放在正确的局部变量中。
在 Tcl 9 中,分辨率进行了调整。这将在几个地方更多地破坏这段代码,但以修复比它制造的更多的错误的方式......
评论
namespace eval NC{[incr i]} [list source file1.tcl]; namespace eval NC{[incr i]} [list source file2.tcl]
NC{1}
NC{2}