行者的学习博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

posted on 2009-07-30 17:50  ylclass  阅读(8788)  评论(0编辑  收藏  举报