如何处理已删除名称空间中的变量?

evi*_*tto 5 tcl

在进行涉及创建和删除名称空间的一些探索时,我遇到了这种好奇心:

% namespace eval foo {variable x 1}
% namespace upvar foo x x
% set x
1
% namespace delete foo
% set x
can't read "x": no such variable
% set x 2
can't set "x": upvar refers to variable in deleted namespace
%
Run Code Online (Sandbox Code Playgroud)

在此之后,x似乎是不可动摇的。无法读取或取消设置它,因为它不存在,但是因为它在另一个名称空间中而无法设置。如何x从这种状态中恢复?

我要完成的工作是从另一个名称空间导入一组命令和变量,并能够删除该名称空间并使导入的命令和变量消失。 namespace delete对于导入的命令来说似乎做得正确,但是导入变量没有等效项,据我所知,甚至没有任何方法可以确定某个特定变量是否(通过namespace upvar)从其他地方导入了- namespace which告诉您当前的名称空间,namespace origin变量不存在。

gle*_*man 1

(不是答案)

对我来说看起来像一个错误=> https://core.tcl-lang.org/tcl/tktnew

您也无法取消设置该变量。似乎你唯一能做的就是将upvar其转换为不同的变量。

% namespace eval foo {variable x 1}
% namespace upvar foo x x
% namespace delete foo
% set x
can't read "x": no such variable
% set x 1
can't set "x": upvar refers to variable in deleted namespace
% unset x
can't unset "x": no such variable
% set tmp ""
% upvar 0 tmp x
% unset x
Run Code Online (Sandbox Code Playgroud)