Это в основном вопрос композиции. [funct [lindex $data $i]]
создает список; это может выглядеть как строка, но это список. Откуда мы это знаем? Он подается в первый аргумент join
, и он определен для принятия списка. Ради аргумента, давайте сделаем этот список довольно простым:
a {b c} d
Теперь давайте сделаем внутреннее [join … { - }]
. Это берет все элементы списка и создает строку этих элементов с -
(ммм, пробелы не очень хорошо отображаются) в качестве разделителя. В нашем примере строка, которая дает:
a - b c - d
Поскольку было три элемента, в результате есть два разделителя. Но теперь мы собираемся сделать join … { - }
снова вокруг этого (я предполагаю, что это то, что вы спрашивали). Это означает, что мы переосмысливаем только что полученную строку в виде списка (это верно, если не всегда самый эффективный подход). Обратите внимание, что -
- это очень хороший обычный литерал элемента списка.
a - - - b - c - - - d
Было бы яснее, если бы мы использовали другой символ во внешнем join
. Здесь вместо |
.
a | - | b | c | - | d
Или мы могли бы использовать соединительную строку без пробелов. С ,
мы получили бы:
a,-,b,c,-,d
В общем, команды Tcl делают то, что они делают немедленно, без попытки заглянуть в более широкий контекст чего-либо. Любое сложное соединение команд может быть разложено на более мелкие части с вспомогательными переменными, и все будет семантически эквивалентно.
Таким образом, мы можем изменить [join [join [funct [lindex $data $i]] { - }] { - }]
на:
set item [lindex $data $i]
set theList [funct $item]
set join1 [join $theList { - }]
set join2 [join $join1 { - }]
Это может иногда сделать вещи намного яснее!