Как вы обрабатываете переменную в удаленном пространстве имен? - PullRequest
5 голосов
/ 24 октября 2019

Проведя некоторое исследование, включающее создание и удаление пространств имен, я натолкнулся на это любопытство:

% 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
%

После этого x кажется неприкосновенным. Его нельзя прочитать или удалить, потому что он не существует, но его нельзя установить, потому что он находится в другом пространстве имен. Как восстановить x из этого состояния?

Я пытаюсь выполнить импорт набора команд и переменных из другого пространства имен и возможность удалить это пространство имен и иметь импортированные команды и переменные. уходи. namespace delete, кажется, делает правильные вещи в отношении импортированных команд, но для импортированных переменных нет эквивалента, и, насколько я могу судить, нет даже способа определить, импортирована ли конкретная переменная (через namespace upvar) откуда-то еще - namespace which сообщает вам текущее пространство имен, а namespace origin не существует для переменных.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

(не ответ)

Выглядит для меня как ошибка => 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
0 голосов
/ 26 октября 2019

Я пытаюсь выполнить импорт набора команд и переменных из другого пространства имен и возможность удалить это пространство имен и удалить импортированные команды и переменные.

Поскольку ваша публикация больше относится к этому ошибочному поведению механизма upvar (и отсутствию самоанализа Tcl), ваша общая мотивация проявляется только в качестве идентификатора. Может быть, вы можете понять, чтов качестве альтернативы (во избежание upvar)?

% namespace eval foo {variable x 1; proc bar {} {;}}
% apply {{} {variable x; puts $x; bar; namespace delete [namespace current]; set x "a"; puts $x} ::foo}
1
a
% apply {{} {variable x; puts $x; bar; namespace delete [namespace current]; set x "a"; puts $x} ::foo}
namespace "::foo" not found
% namespace eval foo {variable x 2; proc bar {} { puts BAR}}
% apply {{} {variable x; puts $x; bar; namespace delete [namespace current]; set x "a"; puts $x} ::foo}
2
BAR
a
  • Вы заменяете среду пространства имен для среды proc как цель "import", и variableНа зомби-ссылки upvar.
  • не влияют. Вы можете поменять пространство имен контекста или заново создать удаленное пространство по своему желанию.
  • Вам не нужно два механизма (namespace import и namespace upvar), всего один.
  • При перелистывании пространства имен контекста произойдет потеря intrep lambdaExpr (включая байт-код), поэтому, возможно, лучше продолжить воссоздание пространства имен ::foo.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...