我正在尝试编写一个小实用程序函数来识别以下形式的列表结构的存在:
{{{{{}}}}} 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
答案 0 :(得分: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
,它会在找到空叶子(没有元素的空字符串/列表)或'item leaf'(带有一个元素的字符串/列表)时打印出一条消息。消息说明叶子的深度(d
)以及分支深度的哪个元素是(e
)。
某些列表模式可能会导致无休止的递归。这不是问题,因为解释器会中断无限循环。