Version 2 of lvarpop

Updated 2009-01-23 23:19:31 by lars_h

lvarpop var ?indexExpr? ?string?

          The lvarpop command pops (deletes) the element indexed by the
          expression indexExpr from the list contained in the variable
          var. If index is omitted, then 0 is assumed. If string is
          specified, then the deleted element is replaced by string. The
          replaced or deleted element is returned. Thus 

          lvarpop argv 0

          returns the first element of argv, setting argv to contain
          the remainder of the string.

          If the expression indexExpr starts with the string "end", then
          end is replaced with the index of the last element in the
          list. If the expression starts with "len", then len is replaced
          with the length of the list.

See also lvarpush.


A quick Tcl-only lvarpop, if you don't want to include all of Tclx in your starpack or starkit:

 proc lvarpop {upVar {index 0}} {
  upvar $upVar list;
  if {![info exists list]} { return "-1" }
  set top [lindex $list $index];
  set list [concat [lrange $list 0 [expr $index - 1]] [lrange $list [expr $index +1] end]]
  return $top;
  }

Sourced from the Wiki somewhere ages ago or perhaps Usenet.

Lars H: Simplified implementation, using lreplace instead of lrange&concat:

 proc lvarpop {upVar {index 0}} {
    upvar 1 $upVar list
    if {![info exists list]} { return "-1" }
    set top [lindex $list $index]
    set list [lreplace $list $index $index]
    return $top
 }

Unlike the above, this supports end-relative indices. It will however throw an error if the index is out-of-range.

Neither proc supports general expressions or len-relative indices, as described in the manpage text above. Nor do they support the third argument of TclX's lvarpop.


Category Command, a part of Tclx