295.tip at [17420af386]

Login

File tip/295.tip artifact fae6ca2c5d part of check-in 17420af386


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.