tcl:string是不区分整数或列表或字符串的列表或者......

Hex*_*ain 1 tcl

我正在尝试编写一个小实用程序函数,它将识别以下形式的列表结构的存在:

{{{{{}}}}} 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

Pet*_*rin 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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

文档:foreach,if,incr,lindex,proc,puts,set,string,switch