Команда source
делает что-то очень как это внутренне:
# Reading phase
set f [open $filename]
try {
fconfigure $f -encoding $encoding -eofchar "\032"
set contents [read $f]
} finally {
close $f
}
# Evaluation phase
set oldScript [info script]
try {
info script $filename
eval $contents
} finally {
info script $oldScript
}
, где $encoding
по умолчанию соответствует тому, что [encoding system]
сообщает.За исключением того, что он делает это в C и имеет некоторые дополнительные сложности для простого разбора аргументов, и имеет несколько иную обработку ошибок в отношении трассировки стека.
В простом случае вы можете преобразовать это в:
set f [open $filename]
set contents [read $f]
close $f
eval $contents
Команда eval
является ключевой здесь: она eval использует сценарий Tcl в строке.Это не очень часто используется в современном Tcl, но для чего-то подобного это предпочтительная команда.
Если вы помещаете код в процедуру, вам нужно изменить eval
на uplevel 1
иметь правильную семантику;source
не не меняет кадр стека для вас:
proc simpleSource {filename} {
set f [open $filename]
set contents [read $f]
close $f
uplevel 1 $contents
}