Команда source
всегда оценивает содержимое файла на уровне current ; на самом деле это просто чтение содержимого файла в строку, а затем eval
(за исключением небольшой хитрости с info script
). Это означает, что если вы хотите source
файл в глобальном контексте, вы должны сделать одно из следующих действий:
# Quotes around #0 just because of Stack Overflow's highlighting
uplevel "#0" {
source thefile.tcl
}
uplevel "#0" [list source $thefile]
namespace eval :: {
source thefile.tcl
}
namespace eval :: [list source $thefile]
Версии с list
выполняют генерацию кода и будут работать намного лучше, когда имя файла находится в переменной (или генерируется такой командой, как file join
); если все буквально, то лучше использовать версии в скобках.
Версии с uplevel #0
отличаются от версий с namespace eval ::
тем, что первый переводит вверх стека на глобальный уровень, тогда как последний просто выдвигает новый кадр стека, который вы можете uplevel
из. В большинстве случаев со здравым кодом различия очень незначительны; используйте тот, который вы предпочитаете, так как оба кода хороши.