Вы должны действительно переосмыслить свой подход: поскольку 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
}
}