Spec-Zone.ru › Tcl/Tk

lmap

Имя

lmap — Итерирование по всем элементам в одном или нескольких списках и сбор результатов

Синтаксис

lmap имяпеременной список тело
lmap списокпеременных1 список1 ?списокпеременных2 список2 ...? тело

Описание

Команда lmap реализует цикл, где переменная(ые) цикла принимают значения из одного или нескольких списков, а цикл возвращает список результатов, собранных в каждой итерации.

В простейшем случае есть одна переменная цикла, имяпеременной, и один список, список, представляющий собой список значений, которые нужно присвоить имяпеременной. Аргумент тело — это скрипт Tcl. Для каждого элемента списка (в порядке от первого до последнего) lmap присваивает содержимое элемента имяпеременной так, как если бы использовалась команда lindex для извлечения элемента, затем вызывает интерпретатор Tcl для выполнения тела. Если выполнение тела завершается нормально, то результат тела добавляется в список-аккумулятор. lmap возвращает список-аккумулятор.

В общем случае может быть более одного списка значений (например, список1 и список2), и каждый список значений может быть связан со списком переменных цикла (например, списокпеременных1 и списокпеременных2). Во время каждой итерации цикла переменные каждого спискапеременных получают последовательные значения из соответствующего списка. Значения в каждом списке используются в порядке от первого к последнему, и каждое значение используется только один раз. Общее число итераций цикла достаточно велико, чтобы использовать все значения из всех списков значений. Если список значений не содержит достаточно элементов для каждой переменной цикла в каждой итерации, для отсутствующих элементов используются пустые значения.

Оператор break и continue могут быть вызваны внутри тела с тем же эффектом, что и в командах for и foreach. В этих случаях тело не завершается нормально, и результат не добавляется в список-аккумулятор.

Примеры

Объединение списков:
set list1 {a b c d}
set list2 {1 2 3 4}
set zipped [lmap a $list1 b $list2 {list $a $b}]
# The value of zipped is "{a 1} {b 2} {c 3} {d 4}"

Фильтрация списка для удаления нечетных значений:

set values {1 2 3 4 5 6 7 8}
proc isEven {n} {expr {($n % 2) == 0}}
set goodOnes [lmap x $values {expr {
    [isEven $x] ? $x : [continue]
}}]
# The value of goodOnes is "2 4 6 8"

Взятие префикса из списка на основе содержимого списка:

set values {8 7 6 5 4 3 2 1}
proc isGood {counter} {expr {$n > 3}}
set prefix [lmap x $values {expr {
    [isGood $x] ? $x : [break]
}}]
# The value of prefix is "8 7 6 5 4"

См. также

break, continue, for, foreach, while

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/lmap.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/lmap.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API