Область действия переменной и исходная команда в Tcl - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть следующие два файла: a.tcl:

set condition false
source b.tcl

b.tcl:

if {$condition} {
    puts "hello"
}

Когда я запускаю .tcl, он печатает "привет". Это правильная практика для доступа к переменной, определенной в .tcl? Какова область действия $ condition в b.tcl? Спасибо.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Область действия condition является глобальной.Команда source оценивает сценарий, прочитанный из указанного файла, в контексте его запуска;в вашем случае этот контекст также является глобальным, поэтому ваш puts работает.

Вопрос о практике сложнее, поскольку он в значительной степени зависит от того, что вы на самом деле делаете.

1 голос
/ 15 декабря 2011

Команда source работает почти так же, как если бы она считывала файл в строку и затем передавала это в eval (единственная тонкость - в info script).Это означает, что область, в которой было выполнено source, будет той, в которой оценивается самый внешний уровень сценария, и поэтому вы можете иметь condition локальной переменной там:

proc funkystuff {condition} {
    source b.tcl
}
funkystuff true

Это будет работать (и на самом деле жизненно важно для работы сценариев определения пакетов Tcl; они оцениваются в контексте, где есть локальная переменная $dir, которая описывает, где находится определение пакета), но это, безусловно, может привестикод, который сбивает с толку!Поэтому рекомендуется писать сценарии так, чтобы код внутри них не делал предположений о том, в каком контексте они оцениваются. Самый простой способ сделать это - часто помещать код в сценарий в пространство имен, где имяпространства имен полностью определено.

namespace eval ::foobar {
    # Do stuff here...
}

Это также хорошая вещь, чтобы попытаться написать код, который не слишком параметризован при поиске, вместо этого сохранить его для любой версии кода, который вы загружаете (например,один файл для Linux, другой для Windows) или какие параметры вы передаете командам.Конечно, у вас нет для такой работы, но это помогает сделать ваш код надежным и легким для понимания.

Наконец, область действия, используемая для основного сценария для интерпретатора Tclвсегда оценивается на глобальном уровне (т. е. в пространстве имен :: без родительской области).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...