поиск tcl-файла в коде itcl на глобальном уровне - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть файл tcl, в котором определены несколько конфигурационных процедур. Мое одно приложение написано в itcl, который должен вызывать эти настройки для каждого объекта. Я не могу найти файл TCL на глобальном уровне в itcl. он позволяет использовать только общедоступные методы, но это не то, что я ищу. Я хочу получить файл tcl сразу только для всех объектов, а затем использовать его до запуска программы. Любые предложения, пожалуйста?

спасибо

1 Ответ

0 голосов
/ 29 апреля 2018

Команда 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 из. В большинстве случаев со здравым кодом различия очень незначительны; используйте тот, который вы предпочитаете, так как оба кода хороши.

...