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

 

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