tcl/tk参考——变量和过程apply

.

.

名称

apply - 申请一个匿名函数

语法

apply func ?arg1 arg2 ...?

描述

apply申请一个函数func,把arg1arg2……作为参数来运行并返回结果。

func是包含两个元素的列表{args body}或者三个元素的列表{args body namespace},第一个元素args指明了func的变元,argsproc命令里面的变元相同。

body的内容在Tcl解释器中运行,它的变元是参数arg1arg2……当body运行时,变量名子引用局部变量,apply会自动创建创建这些变量,返回时自动删除它们,每个函数的变元都回自动生成一个局部变量。全局变量可以使用globalupvar命令进行存取,名字空间变量可以使用variableupvar命令进行存取。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章