Проверьте, возвращает ли процедура список или список с подсписком - PullRequest
1 голос
/ 21 октября 2011

Я столкнулся с проблемой, как проверить, состоит ли список, возвращаемый процедурой, из одного списка или может иметь подсписок внутри.

#simple list
set a { 1 2 3 4}

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

Как и выше, иногда переменная a будет иметьlist и когда-нибудь proc вернет список, состоящий из подсписка.

Обновить часть

установить [mysqlsel $ db "SELECT * FROM abc" -list]

Я незапрос на информацию о погоде вернет один список или список, состоящий из подсписка

1 Ответ

4 голосов
/ 21 октября 2011

Вы должны действительно переосмыслить свой подход: поскольку 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...