TIP: 295
Title: Enhance Arguments to lrange
Version: $Revision: 1.7 $
Author: Andreas Leitgeb <[email protected]>
State: Draft
Type: Project
Vote: Pending
Created: 06-Nov-2006
Post-History:
Keywords: Tcl,lrange
Tcl-Version: 8.7
~ Abstract
This TIP proposes an enhancement to '''lrange''' and '''string range''' that lets them take more than one start-end index pair.
~ Rationale
Sometimes you need to extract a non-continuous selection of elements from some
list and build a new list from them. This requires the use of multiple calls
to '''lrange''' and a surrounding '''concat''' to build the final list.
However, since the following fails with a syntax error:
| lrange {a b c d e f} 1 3 5 5
It would seem a reasonable extension for such a usage of '''lrange''' to
return "b c d f". This would also make following pattern of usage feasible:
| lassign [lrange $someList 0 2 10 12] var0 var1 var2 var10 var11 var12
The indices should ''not'' be required to be in ascending order.
This is meant such that the ranges may be overlapping at will. E.g.:
| [lrange $list 0 end 0 end] == [lrepeat 2 {*}$list]
This TIP does NOT change the way each range is interpreted.
Reversing lists is not in the scope of this TIP.
~ Proposed Change
Change the implementation of '''lrange''' to accept any odd number of
arguments, with semantics (upon supply of a correct number of arguments)
equivalent to:
| proc lrange-new {list args} {
| set result [list]
| foreach {start end} $args {
| lappend result {*}[lrange $list $start $end]
| }
| return $result
| }
~ Draft Implementation
Just the above mentioned procedure, at the moment.
~ Further Thoughts
~ Copyright
This document has been placed in the public domain.