2014-09-18 105 views
1

我试图写一个小效用函数,将确定以下形式的表结构的存在:TCL:字符串是整数或列表或字符串或不之间的区分列表...我

{{{{{}}}}} or {{} {} {} {}}, and so on ... 

我的方法只是编写一个函数,在给定的层次上递归到每个列表的底部,并且如果有东西存在,则设置一个标志。

我的问题是,尽管阅读文档,调用下面:

proc IsNestedEmpty {i_list} { 
    if {[string is list $i_list]} { 
     puts "it was a list" 
    } else { 
     puts "it was not a list" 
    } 
} 

isNestedEmpty 1 
isNestedEmpty "" 
isNestedEmpty "jifjsfjsk" 
isNestedEmpty [list 1 2 3] 

我得到的输出:

it was a list 
it was a list 
it was a list 
it was a list 

TCL的版本我已经是8.5 检查文档中, -strict标志不会有帮助(并且测试它是真实的) - 有其他方法可靠地检查我拥有的是列表吗? (因为如果我遍历一个实际上是整数的“列表”,比如说,我将只返回整数并结束无限循环)

编辑:鉴于字符串不会帮助我......我有一个思想,并似乎有更多的运气...

proc IsNestedEmpty {i_list {isEmpty 1}} { 
    if {$isEmpty} { 
     foreach el $i_list { 
      if {$el == $i_list} { 
       if {$el != ""} { 
        return 0 
       } 
      } else { 
       set isEmpty [IsNestedEmpty $el $isEmpty] 
      } 
     } 
    } 
    return $isEmpty 
} 

仍在试图打破它,但

puts [IsNestedEmpty {{{{"" ""}} "" "" {{{{}}}} } {} {} {} {{{{} {} {} 4}}}}] 
puts [IsNestedEmpty {{{{"" ""}} "" "" {{{{}}}} } {} {} {} {{{{} {} {} }}}}] 

给我0和1分别

+1

我不知道这是否会帮助,但你可以拿上tcllib挤图书馆看看 – Leo 2014-09-18 17:36:34

+0

感谢那,因为我怀疑我能够使用那个库,我最终会使用这个函数来使用这个函数 - 我只限于我自己写的任何东西。 – HexedAgain 2014-09-18 18:06:51

+0

看看我更新的答案。 – 2014-09-18 19:54:06

回答

5

string is list检查的唯一情况是给定的字符串是否为正确的列表。字符串和列表可以在Tcl中互换。文字1是一个包含一个元素的列表。所以命令按照规定工作。

这样的事情可能会有所帮助,但:

proc bar {list d e} { 
    switch [llength $list] { 
     0 { 
      puts "empty leaf found at $d.$e" 
     } 
     1 { 
      set elem [lindex $list 0] 
      if {$elem eq $list} { 
       puts "item leaf found at $d.$e" 
      } else { 
       bar $elem [incr d] $e 
      } 
     } 
     default { 
      incr d 
      foreach elem $list { 
       bar $elem $d $e 
       incr e 
      } 
     } 
    } 
} 

与如说它bar {{{} {}}} 0 0,当它找到一个空叶子(一个没有元素的空字符串/列表)或一个'项目叶子'(一个包含一个元素的字符串/列表)时会打印出一条消息。该消息说明叶子在哪个深度(d)上,以及哪个元素在其分支的深度处是(e)。

某些列表模式可能会导致无限递归。这不是问题,因为解释器会中断无限循环。

文档:foreachifincrlindexprocputssetstringswitch

+0

Aha,考虑到环境,我将使用这个脚本,我将不得不看看是否可以用llength和不检查空串以及其他低级别检查来做。谢谢 – HexedAgain 2014-09-18 17:56:22

+0

不错...只是有一场比赛,而且表现不错 – HexedAgain 2014-09-18 20:27:24

相关问题