检查程序返回列表或带有子列表的列表

时间:2011-10-21 07:15:44

标签: tcl

我面临的问题是如何检查程序返回的列表是由单个列表组成还是可能包含子列表。

#simple list
set a { 1 2 3 4}

# list consisting of sub list
set a { {1 2 3 4} {5 6 7 7} }

如上所述,变量a有时会有一个列表,有时proc会返回包含子列表的列表。

更新部分

设置[mysqlsel $ db“SELECT * FROM abc”-list]

我不知道天气查询会返回单个列表或由子列表组成的列表

1 个答案:

答案 0 :(得分:4)

你应该重新考虑你的方法:因为Tcl是无类型的,你无法确定{{1 2 3 4} {5 6 7 8}}是两个列表的列表还是两个字符串的列表或者文字字符串{1 2 3 4} {5 6 7 8},因为所有这些命题都是正确的,这取决于你如何使Tcl解释这个值。

另一件事是,即使您在每个顶级元素上尝试catch {lindex $element 0}string is list $element之类的内容来查看它是否可以被解释为列表,那么这将被视为非 - 仅列出实际上无法解析为列表的字符串,例如aaa { bbb。字符串foo也是一个正确的列表(长度为1,包含“foo”作为其唯一元素)。

您可以考虑使用的一种方法是将返回的值包装在另一个附加了某种“标记”的值中 - 这种技巧通常用于其他一些无类型语言,如LISP和Erlang。这看起来像这样:

  • 如果您需要返回1 2 3 4,请返回{flat {1 2 3 4}}
  • 如果您需要返回{1 2 3 4} {5 6 7 8},请返回{nested {{1 2 3 4} {1 2 3 4 5}}}

然后在客户端代码中,打开“tag”元素并解封装有效负载:

lassign [your_procedure ...] tag payload
switch -- $tag {
  flat {
    # do something with $payload
  }
  nested {
    # do something with $payload
  }
}