Version 13 of llength

Updated 2007-01-19 15:34:43 by LV

The man page for llength is http://purl.org/tcl/home/man/tcl8.4/TclCmd/llength.htm

This command returns the number of elements in the list. If the string is not a well-formed list, an error will be thrown.


caspian: Make sure to give llength the list, not just the name variable where the list is stored. For example:

 # This is the right way to do it.
 set mylist {a b c}
 # LV writes: technically, _this_ is the right way to do it, at least
 #  for cases more complex than a simple a, b, and c...
 # set mylist [list a b c]
 llength $mylist

 # This is the WRONG way to do it.
 # This won't return an error, but it will always return "1",
 # no matter how long or short your list is.
 set mylist {a b c}
 llength mylist

This is one of those places where Tcl's treatment of bareword literals can be frustrating to someone.

In the second case above, Tcl considers the argument to llength a list. Therefore, it is going to return the length of the list, which is equivalent to this list:

        llength [list "mylist"]

DKF: The phrase "bareword literals" indicates a deviation from the Tcl Way; the concept does not really operate usefully in Tcl, unlike in a number of other languages (*cough*Perl*cough*). The llength command always works with list values, and lists are always values. If you've a list in a variable, you need to get the list out of the variable to work out its length.

LV: Technically, the problem the original writer hit isn't Tcl (as an interpreter", by llength. The documentation clearly indicates that llength takes a list as its argument. When llength looks at its argument, it sees the string mylist , which is a list - a single entry list. It sees the same way in each of these cases:

 llength mylist
 llength "mylist"
 llength {mylist}
 llength [list mylist]

In each of these cases, llength sees the list/string "mylist" and NOT the value of the string.

The problem here is that some of the Tcl l* commands expect the name of a variable, while others expect the value of a variable. And it is up to the developer to keep straight the two types of requirements.

GWM Note also the slightly unexpected result for:

  llength "a b c"  ;# returns 3 as the string (only one string) is interpreted as a 
        list by llength, the spaces making 3 elements. 
  llength "a {b d} c"  ;# is also 3 - the inner braces make a sub-list
  llength {a {b d} c}  ;# also 3 - it is the same as above
  llength "{a {b d} c}" ;# is 1 - the braces inside the string make a sub-list

Also not the difference between braced lists and quoted in this case:

  set a {a b c}
  llength "1 2 $a 3" ;# 6 elements in the substituted list
  llength {1 2 $a 3} ;# 4 elements in the list (which does not have $a substituted)

See also list, lappend, lindex, linsert, lrange, lreplace, lsearch, lsort .


Tcl syntax help - Arts and crafts of Tcl-Tk programming - Category Command