http://blog.csdn.net/dulixin/archive/2008/05/09/2423851.aspx
名称
eval - 调用一个Tcl脚本
语法
eval arg ?arg ...?
描述
eval带一个或多个变元,可以有一个或多个命令组成,eval采用concat命令的风格连接所有变元,执行命令并且返回执行结果(或者错误)。
示例
有的时候,把一些片断脚本连接存储起来然后再执行是很有用的,这种技术在很多Tcl内核中都有使用(比如在fcopy、lsort和trace命令的回调)。下面的命令给出了怎么去使用命令:
set script { puts "logging now" lappend $myCurrentLogVar}set myCurrentLogVar log1# Set up a switch of logging variable part way through!after 20000 set myCurrentLogVar log2for {set i 0} {$i<10} {incr i} { # Introduce a random delay after [expr {int(5000 * rand())}] update ;# Check for the asynch log switch eval $script $i [clock clicks]} 注意在很多情况下(当脚本片断实际上是一个命令的前缀),最好使用{*}$script模式。下面的过程类似于使用lappend命令,插入变元到列表的最前面。
proc lprepend {varName args} { upvar 1 $varName var # Ensure that the variable exists and contains a list lappend var # Now we insert all the arguments in one go set var [eval [list linsert $var 0] $args]}
最后一行可以写成:
set var [linsert $var 0 {*}$args]
eval命令本身使用非常简单,但是用处非常大,如果需要动态的构造命令,那么必须使用eval命令。
命令格式:eval arg ?arg ...?
如果是一个参数,那么相当于把这个参数当作命令来执行,如果有多个参数,eval命令会把多个参数以concat命令风格连接起来然后再执行命令。
举一个最简单的例子:
% set cmd "puts \"This is a tcltk example\""
puts "This is a tcltk example"
% eval $cmd
This is a tcltk example
一般在动态脚本中,主要是由脚本片断组成,脚本片断一般是一个变量,根据实际情况进行变量修改来达到执行不同脚本的目的。
% set a puts
puts
% set b stdout
stdout
% set c "haha"
haha
% eval $a $b $c
haha
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dulixin/archive/2008/05/09/2423851.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dulixin/archive/2008/03/27/2223978.aspx