linsert - insert [element]s into a list http://www.purl.org/tcl/home/man/tcl8.4/TclCmd/linsert.htm ---- linsert list index element1 ?element2 element3 ...? ---- A user asked why linsert $list 0 .. did not result in .. being inserted into list. Jesper Blommaskog (d9jesper@dtek.chalmers.se) replied: When doing list operations other than lappend, you must save the returned value. This applies to list, lindex, lrange, and lreplace at least. In this example, you would perhaps want to do something like: set list [ linsert $list 0 .. ] ---- [TFW] Feb 20, 2004 - Inplace inserts Often time we have a long list we want to insert "in-place", that is without copying the list to a new altered list. Using the [K] combinator it is quite easy. (Note 8.5 is needed for the {expand} command) proc lipinsert {_list index args} { upvar $_list list set list [linsert [K $list [set list ""]] $index {expand}$args] } > set A [list 1 2 3] 1 2 3 > lipinsert A 1 a b c 1 a b c 2 3 ---- [DKF] 26 Oct 2004: The '''linsert''' command can be used to create a "lprepend" command that is like [lappend] except that it puts the values at the start of the list: proc lprepend {var args} { upvar 1 $var v lappend v ;# Used as a an "is a list" check and to do var creation set v [linsert $v[set v {}] 0 {expand}$args] } (Note that this uses a variant on [K] that is more efficient in 8.5a2 but not so hot in previous versions) [Lars H]: Has the above any advantage in comparison with set v [linsert $v [set v 0] {expand}$args] which is anyway slightly shorter? (OK, it can be used also where ther isn't another argument to place the [[set v ]] in, but what about those cases where an alternative exists? Is the idea of the example to establish a new idiom?) [TR] - The easiest way is to use [lreplace] where the first index is -1 and the second is -2 ... like so: set myList [list 0 1 2] set myList [lreplace $myList -1 -2 5] -> 5 0 1 2 ---- [LES] on 2005-10-27: I think that [linsert] is VERY different from [lappend]: lappend '''listName''' string linsert '''$actualList''' index string If list "listName" doesn't exist, [lappend] creates it automatically. Quite unlike linsert, which only addresses actual lists, in the form of variable or explicit lists, but only existing lists. So it cannot create the list automatically. After using [lappend] so often, I find [linsert]'s syntax confusing and less useful. I hope my point is clear: I am not complaining because [linsert] won't create the list automatically. I complain because one command requires the list's name whereas the other, despite its very similar objective, requires an actual list. That is the sort of annoying inconsistency we see so much in [PHP], for example. ---- See also [list], [lappend], [llength], [lrange], [lreplace], [lsearch], [lsort] . ---- [Tcl syntax help] - [Arts and crafts of Tcl-Tk programming] - [Category Command]