From: Andreas L. <av...@lo...> - 2006-11-06 14:34:34
|
TIP #295: ENHANCE ARGUMENTS TO LRANGE ======================================= Version: $Revision: 1.1 $ Author: Andreas Leitgeb <avl_at_logic.at> State: Draft Type: Project Tcl-Version: 8.5 Vote: Pending Created: Monday, 06 November 2006 URL: http://purl.org/tcl/tip/295.html WebEdit: http://purl.org/tcl/tip/edit/295 Post-History: ------------------------------------------------------------------------- ABSTRACT ========== This TIP proposes an enhancement to *lrange* that lets it 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 index-pairs should /not/ be required to be in ascending order (this might be difficult to determine when one index is end-relative), or even disjoint. Even: lrange {a b c d} 3 3 0 3 0 0 should be made legal and return "d a b c d a". 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. COPYRIGHT =========== This document has been placed in the public domain. ------------------------------------------------------------------------- TIP AutoGenerator - written by Donal K. Fellows |