Повышение области видимости переменной, не зная ее имени
Мне нужно "упвар" переменные из source
файл (а я не знаю их имен)
Допустим, у меня есть файл TCL, содержащий:
set v 7
Теперь это:
proc p {} {
source t.tcl
}
p
puts $v
# => can't read "v": no such variable
Файл t.tcl не должен быть изменен.
Я также не могу знать о содержании t.tcl
, Давайте предположим, что это передается как env
переменная. Как мне сделать v
видно на верхнем уровне?
1 ответ
Для кода, который вы разместили, измените определение p
чтобы:
proc p {} {
upvar 1 v v
source t.tcl
}
или (чтобы конкретно связать переменную с верхним уровнем:
proc p {} {
upvar #0 v v
source t.tcl
}
(Примечание: подсветка синтаксиса считает строку "#0 v v"
это комментарий, но это не так.)
Члены env
являются глобальными, так что у вас не будет этой проблемы там.
Однако, если вы не знаете имен переменных, это не так просто, потому что вы не можете upvar
переменная, как только она существует.
Можно ли оценить source
команда на верхнем уровне, вот так:
proc p {} {
uplevel #0 source t.tcl
}
(Опять не комментарий.)
Или вы должны оценить это в p
уровень?
Документация: proc, put, set, source, uplevel, upvar
Документация для env
(Примечание: "Hoodiecrow", упомянутый в комментариях - это я, я использовал этот ник ранее.)