Повышение области видимости переменной, не зная ее имени

Мне нужно "упвар" переменные из 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", упомянутый в комментариях - это я, я использовал этот ник ранее.)

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