我有一个Tcl程序,我常常找到以下类型的表达式:
proc func {} {...}
...
lappend arr([set v [func]]) $v
最后一行的预期含义是
set v [func]
lappend arr($v) $v
显然有效。我想知道的是:它是“偶然”工作,还是Tcl保证传递给lappend的第一个参数在第二个之前得到评估?
答案 0 :(得分:3)
Tcl始终从左到右进行评估,因为您可以阅读documentation,我引用该部分:
替换从左到右进行,并且在尝试评估下一个替换之前完全评估每个替换。因此,序列如:
set y [set x 0][incr x][incr x]
总是将变量y设置为值012。
答案 1 :(得分:3)
同意杰瑞。添加一些味道。
Tcl命令分两步评估:解析& 执行。
让我们考虑以下代码。
%set input "The cat in the hat"
The cat in the hat
%string match "*at in*" $input
1
在解析步骤中,Tcl解释器应用本章中描述的规则将命令分成单词并执行替换。
对于每个命令, 解析以完全相同的方式完成。在解析步骤期间,Tcl解释器不对单词的值应用任何含义。 Tcl只执行一组简单的字符串操作,例如用存储在变量a中的字符串替换字符$a
。 Tcl不知道或关心一个或所得到的单词是一个小部件或小部件的名称还是其他任何东西。
在执行步骤中,意义应用于命令的单词。 Tcl将第一个单词视为命令名称,检查命令是否已定义并查找命令过程以执行其功能。如果定义了该命令,则Tcl解释器调用其命令过程,将命令的所有单词传递给命令过程。命令过程可以自由地以任何方式解释单词,并且不同的命令对它们的参数应用非常不同的含义。
要记住的主要规则
- Tcl解析一个命令并从左到右进行一次替换。每个字符只扫描一次。
- 每个字符最多只有一层替换;一次替换的结果不会进一步扫描 取代。
醇>