.
.
名稱
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