Tcl:参数评估是否保证从左到右?

Tcl:参数评估是否保证从左到右?,tcl,Tcl,我有一个Tcl程序,我经常在其中找到以下类型的表达式: proc func {} {...} ... lappend arr([set v [func]]) $v 最后一行的意思是 set v [func] lappend arr($v) $v 这显然有效。我想知道的是:它是偶然工作的,还是Tcl保证传递给lappend的第一个参数在第二个参数之前进行计算?Tcl总是从左到右进行计算,正如您在上所看到的,我引用的部分: 替换从左到右进行,在尝试评估下一个替换之前,将对每个替换进行完全评估。因

我有一个Tcl程序,我经常在其中找到以下类型的表达式:

proc func {} {...}
...
lappend arr([set v [func]]) $v
最后一行的意思是

set v [func]
lappend arr($v) $v

这显然有效。我想知道的是:它是偶然工作的,还是Tcl保证传递给lappend的第一个参数在第二个参数之前进行计算?

Tcl总是从左到右进行计算,正如您在上所看到的,我引用的部分:

替换从左到右进行,在尝试评估下一个替换之前,将对每个替换进行完全评估。因此,序列如下所示:

set y [set x 0][incr x][incr x]
将始终将变量y设置为值012


Tcl总是从左到右进行评估,正如您可以在上看到的,我引用以下部分:

替换从左到右进行,在尝试评估下一个替换之前,将对每个替换进行完全评估。因此,序列如下所示:

set y [set x 0][incr x][incr x]
将始终将变量y设置为值012


我同意杰瑞的看法。在里面加点味道

Tcl命令分两个步骤进行评估:解析和执行

首先,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解析命令并在从左到右的单个过程中进行替换。每个字符只扫描一次。 每个字符最多只发生一层替换;不扫描一次替换的结果以获取进一步信息 替换。
参考资料:

同意Jerry的意见。在里面加点味道

Tcl命令分两个步骤进行评估:解析和执行

首先,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解析命令并在从左到右的单个过程中进行替换。每个字符只扫描一次。 每个字符最多只发生一层替换;不扫描一次替换的结果以获取进一步信息 替换。
参考资料:

这是严格的保证。它在表达式中也有保证;每样东西都有一个定义好的评估顺序,如果你发现任何违反这个顺序的东西,那就是一个bug,应该这样报告。这是一个严格的保证。它在表达式中也有保证;每样东西都有一个定义好的评估顺序,如果你发现任何违反这个顺序的东西,那就是一个bug,应该这样报告。