我正在尝试编写一个小实用程序函数,它将识别以下形式的列表结构的存在:
{{{{{}}}}} or {{} {} {} {}}, and so on ...
Run Code Online (Sandbox Code Playgroud)
我的方法只是编写一个函数,它将递归到给定级别的每个列表的底部,并设置一个标志,如果有的话.
我的问题是,尽管阅读了文档,但请调用以下内容:
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]
Run Code Online (Sandbox Code Playgroud)
我得到输出:
it was a list
it was a list
it was a list
it was a list
Run Code Online (Sandbox Code Playgroud)
我拥有的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
}
Run Code Online (Sandbox Code Playgroud)
仍然试图打破它,但是
puts [IsNestedEmpty {{{{"" ""}} "" "" {{{{}}}} } {} {} {} {{{{} {} {} 4}}}}]
puts [IsNestedEmpty {{{{"" ""}} "" "" {{{{}}}} } {} {} {} {{{{} {} {} }}}}]
Run Code Online (Sandbox Code Playgroud)
分别给我0和1
唯一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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
例如bar {{{} {}}} 0 0
,当它找到一个空叶子(一个没有元素的空字符串/列表)或一个'item leaf'(一个包含一个元素的字符串/列表)时,它将打印出一条消息.消息说明d
叶子在哪个深度(),以及在它分支的深度处的哪个元素是(e
).
某些列表模式可能会导致无休止的递归.这不是问题,因为解释器会中断无限循环.
文档:foreach,if,incr,lindex,proc,puts,set,string,switch