是否有破坏性版本的 tcl linsert?

is there a destructive version of tcl linsert?

假设我有一个巨大的列表,我想插入一个值,w/o 创建一个副本(性能)。如果想追加到末尾,可以使用 lappend。有没有一种方法可以在开始时对任何内部元素执行等效操作?
IE。此代码:

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

将产生结果:

>0

谢谢。

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

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

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

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