Spec-Zone.ru › Tcl/Tk

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API