Я хочу понять такую ​​команду [присоединиться] - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь изучить TCL, и одна из моих задач - написать процедуру, которая будет работать с таким кодом.

1. [join [funct [lindex $data$i]] { - }] - i dont understand that at all but...
2. [join [funct] { - }] - ... i understand this in 100%, and know what happend here
  1. Это список соединений из процедуры "funct" и создание одной строки, используя "-" между словами. Но 1. это какая-то магия для меня. Мне нужно специальное возвращение в процедуру для работы с 1? Потому что сейчас я просто использую:
return $data

Нужна помощь;)

1 Ответ

0 голосов
/ 15 мая 2019

Это в основном вопрос композиции. [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 { - }]

Это может иногда сделать вещи намного яснее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...