是否有破坏性版本的 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
代码正常工作;它有一个用于优化非共享对象操作的代码路径。
假设我有一个巨大的列表,我想插入一个值,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
代码正常工作;它有一个用于优化非共享对象操作的代码路径。