Posted to tcl by stevel at Thu Jul 20 03:00:11 GMT 2023view pretty
# NAME apply - Apply an anonymous function # SYNOPSIS **apply ***func* ?*arg1 arg2 \...*? # DESCRIPTION The command **apply** applies the function *func* to the arguments *arg1 arg2 \...* and returns the result. The function *func* is a two element list *{args body}* or a three element list *{args body namespace}* (as if the **list** command had been used). The first element *args* specifies the formal arguments to *func*. The specification of the formal arguments *args* is shared with the **proc** command, and is described in detail in the corresponding manual page. The contents of *body* are executed by the Tcl interpreter after the local variables corresponding to the formal arguments are given the values of the actual parameters *arg1 arg2 \...*. When *body* is being executed, variable names normally refer to local variables, which are created automatically when referenced and deleted when **apply** returns. One local variable is automatically created for each of the function\'s arguments. Global variables can only be accessed by invoking the **global** command or the **upvar** command. Namespace variables can only be accessed by invoking the **variable** command or the **upvar** command. The invocation of **apply** adds a call frame to Tcl\'s evaluation stack (the stack of frames accessed via **uplevel**). The execution of *body* proceeds in this call frame, in the namespace given by *namespace* or in the global namespace if none was specified. If given, *namespace* is interpreted relative to the global namespace even if its name does not start with The semantics of **apply** can also be described by: 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 } # EXAMPLES This shows how to make a simple general command that applies a transformation to each element of a list. 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 The **apply** command is also useful for defining callbacks for use in the **trace** command: 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 # SEE ALSO proc(n), uplevel(n) # KEYWORDS anonymous function, argument, lambda, procedure,