Tcl lappend在$varName上是如何工作的?

Tcl lappend在$varName上是如何工作的?,tcl,Tcl,我犯了一个愚蠢的错误,给了lappend一个前缀为$的变量名。因此,以下是: > set l [list e1 e2 e3] e1 e2 e3 > puts $l e1 e2 e3 > lappend $l e4 e4 我知道这是一个错误的用法,它并不像我预期的那样工作。。。但令我惊讶的是,它不知怎么起作用了。也就是说,口译员没有回避。它看起来像是有效的TCL,但我不知道它到底做了什么 我认为它可能会扩展$l并执行lappend e1 e2 e4,但没有e1变量 e4附加到哪

我犯了一个愚蠢的错误,给了lappend一个前缀为$的变量名。因此,以下是:

> set l [list e1 e2 e3]
e1 e2 e3
> puts $l
e1 e2 e3
> lappend $l e4
e4
我知道这是一个错误的用法,它并不像我预期的那样工作。。。但令我惊讶的是,它不知怎么起作用了。也就是说,口译员没有回避。它看起来像是有效的TCL,但我不知道它到底做了什么

我认为它可能会扩展$l并执行lappend e1 e2 e4,但没有e1变量


e4附加到哪里?名为$l的变量是否可以有这样的变量名?

它被附加到名为e1 e2 e3的变量后,即空格是名称的一部分。命令调用中的参数数量在变量替换期间保留,因此,如果$l是单个参数,则它扩展到的值仍然是单个参数,就像您编写了{e1 e2 e3}一样。如果您编写的是lappend{*}$le4,则调用将是lappend e1 e2 e3 e4命令名和四个参数,将值e2、e3和e4附加到名为e1的变量,假设为Tcl 8.5或更高版本


文档:

它被附加到名为e1 e2 e3的变量中,即空格是名称的一部分。命令调用中的参数数量在变量替换期间保留,因此,如果$l是单个参数,则它扩展到的值仍然是单个参数,就像您编写了{e1 e2 e3}一样。如果您编写的是lappend{*}$le4,则调用将是lappend e1 e2 e3 e4命令名和四个参数,将值e2、e3和e4附加到名为e1的变量,假设为Tcl 8.5或更高版本


文档:

%set l[列表e1 e2 e3]

e1 e2 e3


%lappend$l e4%set l[列表e1 e2 e3]

e1 e2 e3


%lappend$le4噢,所以我缺少了${e1 e2 e3}来检索命令的结果。谢谢。哦,所以我缺少了${e1 e2 e3}来检索命令的结果。谢谢。对不起,我不同意。我们不是在创建变量$LW,而是在创建一个名为e1 e2 e3的变量。我猜是1美元,但我错了。对不起,我不同意。我们不是在创建变量$LW,而是在创建一个名为e1 e2 e3的变量。我猜是1美元,但我错了。