Version 5 of list level

Updated 2002-06-02 07:01:57

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 len [llength [split $text]]
     for {set count 0} {$len!=[set len [llength $text]]} {incr count} {
        # Used to be [eval concat $text] but this is safer
        set text [eval [linsert $text 0 concat]]
     }
     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.