[Klaus Saalfeld] A function `lselect` is proposed that selects a number of items from a list and returns them as a new list. In contrast to known `lindex` with multiple indices `lselect` doesn't operate on nested lists but on flat lists. The returned list contains the items in the same order as specified with the indices argument. ====== # Returns from the specified list one or more elements identified by given indices. # The first element in list is given by index 0, the last element of list is given by "end". # An optional negative offset (e.g. "end-1") can be used to specify elements relative to the end of list. # The list to operate on is passed by value. proc lselect {value indices} { set result {} if {0 != [llength $value]} { foreach index $indices { if {0 == [string compare -length 3 $index end]} { set index [expr ([llength $value] - 1) [string range $index 3 end]] } if {($index >= 0) && ($index < [llength $value])} { lappend result [lindex $value $index] } } } return $result } ====== Some examples: ====== % lselect {car house tiger penguin} {end-1 1 end 0} tiger house penguin car % lselect {banana pineapple orange} 1 pineapple % lselect {tcl is great} {-1 17 end-8} ====== Many list operations are a special case of `lselect`. For example: * `lindex $x $n` corresponds to `lselect $x $n`. * `lrange` means selecting a consecutive range of items from a list `lselect` is moreover useful to implement stack or buffer like behavior with lists or to shuffle lists. ** See also ** * [Additional list functions]