eval 能自动使用contact功能把字符串连接到一起。
1.如果其后跟的是List 那么会将List的层级减少一层
set string “Hello, World!”
set cmd [list puts stdout $string]
=> puts stdout {Hello, World!}
unset string /*尽管此处string已被撤销,但是list其实已经生成,无碍下面调用list*/
eval $cmd /*此处的cmd的值是一个list,根据eval会自动调用contact,而把list的最上层拿掉,保持$string的值为一个参数,尽管substituation后可能会存在空格,但依然被视为一个参数。*/
=> Hello, World!
如用下面用法:
set cmd “puts stdout $string”
=> puts stdout Hello, World!
eval $cmd /*因为$string里面可能含有空格,会被tcl interpretor解释成多个参数,而puts 如果在制定输出的时候,只可能有两个参数,出错而不能识别World!*/
=> bad argument “World!”: should be “nonewline”
2.如果其后跟的不是一个List
# PackedButton creates and packes a button.
proc PackedButton {path txt cmd {pack {-side right}} args} {
eval {button $path -text $txt -command $cmd} $args
eval {pack $path} $pack
/*此处用{pack $path} $pack会首先用contact把{pack $path}的最外一层{}拿掉,同时也把$pack的最外层拿掉,而连成一个新字串,但是pack $path中的$path所包含的依然被看成是一个参数*/
}