.
.
名称
apply - 申请一个匿名函数
语法
apply func ?arg1 arg2 ...?
描述
apply申请一个函数func,把arg1、arg2……作为参数来运行并返回结果。
func是包含两个元素的列表{args body}或者三个元素的列表{args body namespace},第一个元素args指明了func的变元,args与proc命令里面的变元相同。
body的内容在Tcl解释器中运行,它的变元是参数arg1、arg2……当body运行时,变量名子引用局部变量,apply会自动创建创建这些变量,返回时自动删除它们,每个函数的变元都回自动生成一个局部变量。全局变量可以使用global或upvar命令进行存取,名字空间变量可以使用variable或upvar命令进行存取。
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
}
示例
下面的内容说明了如果使用一个简单的命令来为列表中的每一个元素进行apply运算。
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