Невозможно определить переменную пространства имен, которая была определена глобально TCL - PullRequest
1 голос
/ 14 мая 2019

Я не могу определить переменные в пространстве имен (в TCL), которое было определено ранее в глобальной области видимости. Смотрите мой пример:

xsct% $tcl_version
[8.5]
xsct% set foo 1
1
xsct% $foo
[1]
xsct% namespace eval ns {
set foo 2
set bar 3
}
3
xsct% $::ns::bar
[3]
xsct% $::ns::foo
can't read "::ns::foo": no such variable
xsct%

Я воспроизвел проблему онлайн: http://tpcg.io/3SIBYG

Как определить переменные в пространствах имен независимо от глобальной области видимости?

Я использую:

  • Win10
  • TCL 8.5 в консоли XSCT TCL Xilinx

1 Ответ

2 голосов
/ 14 мая 2019

Всегда определяйте переменные в пространстве имен с помощью команды variable, по крайней мере, при первом обращении к ним, в противном случае вы получите правила разрешения переменных пространства имен , которые сделают вашу жизнь неприятной.Они странные (хотя на самом деле очень похожи на то, как работает разрешение команд), и вы практически никогда не захотите их, и могут быть удалены в Tcl 9. Но до тех пор вы застряли:

namespace eval ns {
    variable foo 2
    variable bar 3
}

или:

namespace eval ns {
    variable foo
    set foo 2
    variable bar
    set bar 3
}

Если вы хотите делать массивы, вы можете.Сделайте их так (только с одним аргументом variable):

namespace eval ns {
    variable ary
    array set ary {foo 2 bar 3}
}

На самом деле команда variable делает переменную в пространстве имен в unset состоянии так что он все еще разрешается, когда такие команды, как set и array могут найти переменную и записать в нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...