apply
Имя
apply — Применение анонимной функцииСинтаксис
apply func ?arg1 arg2 ...?Описание
Команда apply применяет функцию func к аргументам arg1 arg2 ... и возвращает результат.Функция func представляет собой список из двух элементов {args body} или из трёх элементов {args body namespace} (как будто использовалась команда list). Первый элемент args определяет формальные аргументы функции func. Определение формальных аргументов args совпадает с определением в команде proc и подробно описано в соответствующей справке.
Содержимое body выполняется интерпретатором Tcl после того, как локальные переменные, соответствующие формальным аргументам, получат значения фактических параметров arg1 arg2 .... Во время выполнения body имена переменных обычно относятся к локальным переменным, которые создаются автоматически при ссылке и удаляются при возвращении apply. Для каждого аргумента функции автоматически создаётся одна локальная переменная. Доступ к глобальным переменным возможен только с помощью команды global или команды upvar. Доступ к переменным пространства имён возможен только с помощью команды variable или команды upvar.
Вызов apply добавляет фрейм вызова в стек вычислений Tcl (стек фреймов, к которому можно получить доступ через uplevel). Выполнение body происходит в этом фрейме вызова, в пространстве имён, заданном namespace, или в глобальном пространстве имён, если оно не указано. Если указано, namespace интерпретируется относительно глобального пространства имён, даже если его имя не начинается с «::».
Семантику apply также можно описать следующим образом:
proc apply {fun args} {
set len [llength $fun]
if {($len < 2) || ($len > 3)} {
error "can't interpret \"$fun\" as anonymous function"
}
lassign $fun argList body ns
set name ::$ns::[getGloballyUniqueName]
set body0 {
rename [lindex [info level 0] 0] {}
}
proc $name $argList ${body0}$body
set code [catch {uplevel 1 $name $args} res opt]
return -options $opt $res
} Примеры
Здесь показано, как создать простую общую команду, применяющую преобразование к каждому элементу списка.proc map {lambda list} {
set result {}
foreach item $list {
lappend result [apply $lambda $item]
}
return $result
}
map {x {return [string length $x]:$x}} {a bb ccc dddd}
→ 1:a 2:bb 3:ccc 4:dddd
map {x {expr {$x**2 + 3*$x - 2}}} {-4 -3 -2 -1 0 1 2 3 4}
→ 2 -2 -4 -4 -2 2 8 16 26 Команда apply также полезна для определения обратных вызовов для использования в команде trace:
set vbl "123abc"
trace add variable vbl write {apply {{v1 v2 op} {
upvar 1 $v1 v
puts "updated variable to \"$v\""
}}}
set vbl 123
set vbl abc См. также
proc, uplevel
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/apply.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/apply.htm