Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl[列表abc]与{abc}有区别吗?在什么环境下?_Tcl - Fatal编程技术网

Tcl[列表abc]与{abc}有区别吗?在什么环境下?

Tcl[列表abc]与{abc}有区别吗?在什么环境下?,tcl,Tcl,我在玩Tcl,发现了几个场景,[list a b c]可以与{a b c}互换。首选的方法是什么,以及[列出a b c]在哪里与{a b c}的行为不匹配 % set lista [list a b c] a b c % set listb {a b c} a b c % set b {1 2 3} 1 2 3 % set lista [list a $b c] a {1 2 3} c % set listb {a $b c} a $b c 使用文字构建列表时,这两种形式是等效的。使用变量时,

我在玩Tcl,发现了几个场景,
[list a b c]
可以与
{a b c}
互换。首选的方法是什么,以及
[列出a b c]
在哪里与
{a b c}
的行为不匹配

% set lista [list a b c]
a b c
% set listb {a b c}
a b c
% set b {1 2 3}
1 2 3
% set lista [list a $b c]
a {1 2 3} c
% set listb {a $b c}
a $b c
使用文字构建列表时,这两种形式是等效的。使用变量时,
[list…]
表单将在将变量放入字符串之前展开变量,
{…}
表单将不会展开变量


本质上,
{…}
将其中的任何内容视为一个单一的连续字符串;特殊字符
$
永远不会被解释。
[list…]
语句接受其参数并将它们连接在一起,用空格分隔。因此,如果您正在处理的项目是字符串文字,并且不包含任何需要解释的内容,那么这两种形式是相同的。

对于文字,它们在所有功能方面都是相同的(当然,除了直接文字形式稍微快一点之外)。对于非文本,它们显然在做不同的事情(正如bta所说)

然而,事情远不止这些。让我们潜得更深一点

有些情况下,您不想使用
{…}
“…”
表单,而这正是在处理某些非文本时。特别是,如果您正在使用or(即Jacl或TclBlend),那么您将使用不符合Tcl语义的对象。特别是,将“易碎”对象附加到某些值;如果包含对该值的引用的
Tcl\u Obj
的类型发生了更改(用Tcl的说法是“shimmed”),那么对底层COM或Java对象的引用将被不可恢复地删除,垃圾收集器将在您完成该对象之前删除该对象。使用
[list…]
表单构建列表(以及使用
lindex
等列表操作进行检索)将确保正确维护这些脆弱的内部表示,直到您不再需要它们为止

对于正常的Tcl值,包括大多数扩展包生成的值,您不必担心这一点,只需注意使用无损耗操作也会更快。如果你想让你的代码变得快速(谁不呢?),那么
[list]
就是你的朋友,即使不需要(通常是这样)

您需要注意的另一种情况是在生成回调时


通常,您希望在创建回调时某些值是已知的,而不是存储在执行回调时存在的某个变量中进行回调。(我经常使用
after
fileevent
trace
,但有很多地方可以这样做。)使用
list
创建的回调脚本(或其他一些生成列表的命令)由于Tcl脚本求值引擎可以证明它们没有替换项,并直接将列表元素提供给命令分派器,因此比所有其他替代项都要快。当您只是将值传递给过程时,这是一个相当大的优势,这被认为是回调的良好实践。

也许值得与“set list c”a$b c“进行比较。还有JTcl,它是Jacl的继承者。但是,不值得编辑文章来添加它。