$varName 上的 lappend 如何工作?

How does lappend on $varName work?

我犯了一个愚蠢的错误,给lappend一个$前缀的变量名。所以如下:

> set l [list e1 e2 e3]
e1 e2 e3
> puts $l
e1 e2 e3
> lappend $l e4
e4

我知道这是错误的用法,它没有像我预期的那样工作...但令我惊讶的是它以某种方式工作。即口译员不会保释它。看起来像有效的 TCL,但我不知道它到底做了什么。

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

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

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

文档:lappend

% set l [list e1 e2 e3]

e1 e2 e3

% lappend $l e4 <<<<< 这意味着,我们正在创建一个新变量“$l”并将其附加到其中。 - 这是我们需要做出改变的地方。

e4

% lappend l e4 <<<< 这就是我们想要的 ---> 这里我们追加到我们的变量 "l"

e1 e2 e3 e4