Version 3 of list level

Updated 2002-05-26 11:27:29

ulis: If, for some syntax analyzis, you need to know the level of nested braces inside a list, here is a tiny proc that do that.

It returns 0 for "this is a list", 1 for "{this is a list}" or "this {is a} list", and so on.


  proc listlevel {text} \
  { 
    set count 0
    set old [llength $text]
    set new 0
    while 1 \
    {
      set text [eval concat $text]
      set new [llength $text]
      if {$new != $old} { set old $new; incr count } \
      else { break }
    }
    return $count
  }

Results:

  set text "this is a list"
  puts "$text: [listlevel $text]"
  -> this is a list: 0

  set text {this is a list}
  puts "$text: [listlevel $text]"
  -> this is a list: 0

  set text [list this is a list]
  puts "$text: [listlevel $text]"
  -> this is a list: 0

  set text [list "this is a list"]
  puts "$text: [listlevel $text]"
  -> {this is a list}: 1

  set text {{this is a} list}
  puts "$text: [listlevel $text]"
  -> {this is a} list: 1

  set text {{this {is a}} list}
  puts "$text: [listlevel $text]"
  -> {this {is a}} list: 2

Tcl makes no difference between "this is a list" and list this is a list so I gave them the 0 level.

You can need to differentiate empty strings, one word strings and multi words strings before nested lists.