Они похожи, но немного отличаются.
upvar позволяет вам получить доступ к переменным до уровня x в стеке вызовов.
Они не обязательно должны быть глобальными переменными.
Вы можете использовать upvar для эмуляции global, передавая upvar # 0 varName localVarName
В этом случае вы получите глобальную переменную с локальным именем.
Чтобы эмулировать передачу по ссылке, вам нужно передать имя переменной, а затем вызвать upvar для этого имени.
Если вы знаете имя переменной, вы можете использовать ее как есть.
Соблюдайте следующий код:
# here there is only 1 global variable, but we also need to access to variables defined in the calling functions
proc p3 {} {
# upvar defaults to 1, so not needed to put in here
# also notice you can call upvar on more than one variable
upvar dog myDog horse myHorse cat myCat
upvar 2 cow myCow alpha myAlpha
upvar #0 samurai mySamurai
puts "Level 1: $myDog $myHorse $myCat"
puts "Level 2: $myCow $myAlpha"
puts "Global : $mySamurai"
}
proc p2 {} {
set dog "bowow"
set horse "niegh"
set cat "meow"
p3
}
proc p1 {} {
set cow "moo"
set alpha "beta"
p2
}
set samurai "japan"
p1
Это возвращает
Level 1: bowow niegh meow
Level 2: moo beta
Global : japan
upvar - это просто способ получить переменные из стека вызовов. (вызов функций), включая «глобальный» стек.