eval
Имя
eval — Выполнение скрипта TclСинтаксис
eval arg ?arg ...?Описание
Eval принимает один или несколько аргументов, которые вместе составляют скрипт Tcl, содержащий одну или несколько команд. Eval конкатенирует все свои аргументы таким же образом, как команда concat, передает полученную строку интерпретатору Tcl рекурсивно и возвращает результат этого выполнения (или любую ошибку, сгенерированную им). Обратите внимание, что команда list приводит последовательности слов в кавычки таким образом, что команда eval не расширяет их далее.Примеры
Часто бывает полезно сохранить фрагмент скрипта в переменной и выполнить его позже с добавленными значениями. Эта техника используется во многих местах ядра Tcl (например, в командах fcopy, lsort и обратных вызовах команды trace). Этот пример показывает, как это сделать с помощью основных команд Tcl:set script {
puts "logging now"
lappend $myCurrentLogVar
}
set myCurrentLogVar log1
# Set up a switch of logging variable part way through!
after 20000 set myCurrentLogVar log2
for {set i 0} {$i<10} {incr i} {
# Introduce a random delay
after [expr {int(5000 * rand())}]
update ;# Check for the asynch log switch
eval $script $i [clock clicks]
} Обратите внимание, что в большинстве случаев (когда фрагмент скрипта на самом деле просто список слов, образующих префикс команды), лучше использовать {*}$script при выполнении этого типа вызова. Это менее универсально, чем команда eval, и поэтому проще сделать надёжным на практике. Следующая процедура действует аналогично команде lappend, но она вставляет значения аргументов в начало списка в переменной:
proc lprepend {varName args} {
upvar 1 $varName var
# Ensure that the variable exists and contains a list
lappend var
# Now we insert all the arguments in one go
set var [eval [list linsert $var 0] $args]
} Однако, последняя строка обычно записывается без eval, так:
set var [linsert $var 0 {*}$args] См. также
catch, concat, error, errorCode, errorInfo, interp, list, namespace, subst, uplevel
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/eval.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/eval.htm