Tcl 使用eval为脚本提供参数

Tcl 使用eval为脚本提供参数,tcl,eval,Tcl,Eval,我真的不明白如何使用eval参数。 如果我要评估的脚本是: set myscript { puts $::argv } 然后我想这样调用我的脚本: eval $myscript anArgument 我希望输出为“辩论”,但我有: can not find channel named "" while evaluating {eval $script vvv} 当您调用eval时,该命令将连接其所有参数并尝试计算结果列表(或字符串,如果您愿意,在这里也是一样)。因此,首先将参数{puts$

我真的不明白如何使用
eval
参数。 如果我要评估的脚本是:

set myscript { puts $::argv }
然后我想这样调用我的脚本:

eval $myscript anArgument
我希望输出为“辩论”,但我有:

can not find channel named ""
while evaluating {eval $script vvv}

当您调用
eval
时,该命令将连接其所有参数并尝试计算结果列表(或字符串,如果您愿意,在这里也是一样)。因此,首先将参数
{puts$::argv}
anaargument
连接到列表
{puts$::argv anaargument}
,然后解释器尝试对其求值。如果全局变量
argv
的值为空列表,则调用的实际命令将等效于
put{}anaargument
puts
将尝试使用
{}
作为通道标识符输出到,失败并留下错误消息

现在,如果您想做的是将
anaargument
传递给
myscript
,然后将
eval
作为
put anaargument
,您应该改为编写

set myscript {puts $myarg}
set myarg anArgument
eval $myscript
在第一行中,
$myarg
的计算被推迟,因为引号将
$
转换为常规文本字符。然后将变量
myarg
设置为一个值(只要它位于
eval
之前,代码中的任何位置都可能发生这种情况)。在第三行中,对脚本求值,此时参数
$myarg
被值
anaargument
替换,然后打印

您尝试的调用类型是可能的,但是您需要使用
apply
而不是
eval
,以及闭包(匿名函数)而不是脚本

set myfunc {myarg {puts $myarg}}
apply $myfunc anArgument
全局变量
argv
不会将参数传递给传递给
eval
的脚本:当操作系统启动
tclsh
wish
时,给定的任何命令行参数都放置在
argv
中,并且除非您自己更改,否则在执行过程中不会更改该值(不要那样做,这只是让人困惑)

文件:

argv
已记录在案