afaik, есть два способа создать и назначить переменную в пространстве имен в Tcl:
namespace eval ::myspace:: {
variable foo 1
}
set ::myspace::bar 2
на самом деле, эти два эквивалента:
info vars ::myspace::*
# ::myspace::foo ::myspace::bar
Некоторое время я задавался вопросом, действительно ли они эквивалентны (и какая из них предпочтительнее).
@Filburt, это не очень полезный и гостеприимный ответ. Должен признаться, что я тоже не нахожу это различие очевидным. Документация Tcl оставляет желать лучшего. Надеюсь, кто-то более знающий сможет дать нам окончательный ответ.
@Filburt, наверное, об этом уже спрашивали и уже отвечали. Тем не менее, я провел предварительное исследование, прежде чем задать вопрос (очевидно, сверившись с документацией Tcl и выполнив веб-поиск практически по тем поисковым запросам, которые вы использовали), и не смог идентифицировать такой повторяющийся вопрос (не говоря уже о ответ на вопрос) - как вы наверняка знаете, иначе вы, надеюсь, просто проголосовали бы за закрытие этого вопроса, указав на дубликат.
Я вижу, что @Filburt и несколько других закрыли этот вопрос. Я не думаю, что это разумно и доброжелательно, и проголосовал за возобновление работы.
@Filburt Если вопрос уже задавался ранее, вам следует проголосовать за закрытие как дубликат, а не голосовать за закрытие как на основе мнения: спросить, эквивалентны ли две синтаксические формы по эффекту/поведению или могут ли они иметь (тонкие?) различия не спрашивает мнений.

Команда set — это базовая операция. Если вы дадите ему два аргумента, он разрешит переменную с именем, обычно предпочитая локальную переменную всему остальному, и записывает значение в переменную, возвращая содержимое переменной. (Обычно это то же самое, что и записанное вами значение.) С одним аргументом вместо этого считывается переменная.
Команда variable гарантирует, что это имя будет преобразовано в переменную с этим именем в текущем пространстве имен; в контексте с локальными переменными (внутри процедуры или метода) он создает ссылку из локальной переменной с этим именем на разрешенную переменную пространства имен. И также можно написать простую переменную, если вы укажете значение. Он может обрабатывать несколько переменных... но я не так часто им пользуюсь. Имеет пустой результат.
Если вы используете полное имя переменной с set, вы можете напрямую записать любую переменную пространства имен. Это просто другой способ поиска лежащей в основе реальности; переменные — это не их имена, в конце концов, имя — это всего лишь способ найти переменную.
Механизм связи также используется global, upvar и namespace upvar. Это очень быстро (после формирования), обычно требующее одного дополнительного отклонения в механизме байт-кода.
поэтому в моем конкретном примере при инициализации именованных переменных в пространстве имен, когда меня не волнуют возвращаемые значения, они действительно эквивалентны (?). какой из них будет считаться лучшим стилем?
Лучший стиль? Зависит от того, что вы об этом думаете. В этом случае я бы, наверное, использовал variable; Я доволен вложением вещей. Но использование полной формы совершенно не является неправильным; Я использую это, например, для глобальных переменных env и tcl_platform.
Я почти уверен об этом уже спрашивали и уже отвечали