Использование пространства имен /uplevel/global в TCL

У меня есть такой скрипт:

proc subProc1 { } {
    puts $var1
}
proc subProc2 { } {
    puts $var2
}

proc mainProc { args } {
    # Define many variables
    subProc1
    subProc2
    #etc.
}

Я хотел бы, чтобы subProc1 и subProc2 имели переменные, определенные в mainProc. Я могу передать их в качестве аргументов, но это много аргументов, я бы хотел этого избежать.

Я попытался использовать команду upvar, добавив эту строку для меня subProcs:

subProc1 { } {
    upvar $var1 var1 $var2 var2 ;#etc
    puts $var1
    # etc.
}

Но у меня есть сообщение об ошибке "нет такой переменной", и не очень приятно иметь такую ​​огромную строку

Я только что прочитал о пространстве имен, но я не совсем понимаю, как его использовать (плюс я не уверен, что понимаю концепцию, так что она действительно адаптирована к моему варианту использования?)

1 ответ

Решение

upvar это правильный инструмент для этого. Другие команды могут быть эмулированы с upvar,

Но вы делаете ошибку, как вы называете upvar, Вы должны использовать имя переменной, а не ее значение (что приведет к ошибке "нет такой переменной").

upvar var1 var1 var2 var2 ;#...

Я бы подумал об использовании другого способа хранения данных, может быть, словарь или массив?
Это облегчит передачу переменных.

Другие вопросы по тегам