是否存在tcl linsert的破坏性版本?

时间:2015-10-28 11:07:35

标签: list tcl

说我有一个巨大的列表,我想插入一个值,没有创建副本(性能)。如果想要追加到最后,就会使用lappend。有没有办法在开头和任何内部元素上做等效的?
即这段代码:

set k { 1 2 }
destr_ins k 0 0 ; #dummy proc name
puts [lindex $k 0]

会产生结果:

>0

感谢。

1 个答案:

答案 0 :(得分:4)

没有破坏性linsert,但您可以使用“K”技巧伪造一个(以其中一个组合器命名,但不再需要):

set myList [linsert $myList[set myList {}] 0 "a b c"]
#                   ^^^^^^^^^^^^^^^^^^^^^^

字节码引擎(加上参考管理代码)可以有效地将其优化为破坏性操作,前提是列表不在其他地方共享。如果共享,则无论如何都需要副本。程序中的代码最快。

它的工作原理是将列表放在字节码引擎的堆栈上,删除变量保存的引用(假设没有跟踪),然后让linsert代码正常工作;它有一个代码路径,用于优化非共享对象的操作。