Lmap

From Base de connaissances eggdrops & TCL
Jump to: navigation, search

lmap - Itére sur tous les éléments d'une ou plusieurs listes et collecte les résultats

Syntaxe

lmap varlist1 list1 ?varlist2 list2 ...? body

Description

La commande lmap implémente une boucle dans laquelle la ou les variables de boucle prennent les valeurs d'une ou de plusieurs listes, et la boucle renvoie une liste de résultats collectés à chaque itération.

Dans le cas le plus simple, il existe une variable de boucle, varname, et une liste, list, qui est une liste de valeurs à affecter à varname. L'argument body est un script Tcl. Pour chaque élément de la liste (dans l'ordre du premier au dernier), lmap assigne le contenu de l'élément à varname comme si la commande lindex avait été utilisée pour extraire l'élément, puis appelle l'interpréteur Tcl pour exécuter body. Si l'exécution du corps se termine normalement, le résultat du corps est ajouté à une liste d'accumulateurs. lmap renvoie la liste des accumulateurs.

Dans le cas général, il peut y avoir plus d'une liste de valeurs (par exemple, list1 et list2), et chaque liste de valeurs peut être associée à une liste de variables de boucle (par exemple, varlist1 et varlist2). Lors de chaque itération de la boucle, les variables de chaque varlist se voient attribuer des valeurs consécutives de la liste correspondante. Les valeurs de chaque liste sont utilisées dans l'ordre du premier au dernier, et chaque valeur est utilisée exactement une fois. Le nombre total d'itérations de boucle est suffisamment grand pour utiliser toutes les valeurs de toutes les listes de valeurs. Si une liste de valeurs ne contient pas suffisamment d'éléments pour chacune de ses variables de boucle à chaque itération, des valeurs vides sont utilisées pour les éléments manquants.

Les instructions break et continue peuvent être appelées à l'intérieur du corps, avec le même effet que dans les commandes for et foreach. Dans ces cas, le corps ne se termine pas normalement et le résultat n'est pas ajouté à la liste des accumulateurs.

Exemples

Assembler des listes

set list1 {a b c d}
set list2 {1 2 3 4}
set zipped [lmap a $list1 b $list2 {list $a $b}]
# La valeur de $zipped est "{a 1} {b 2} {c 3} {d 4}"

Retirer les valeurs impaires d'une liste

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]
}}]
# La valeur de $goodOnes est "2 4 6 8"

Différence entre deux listes

set list1 {a b c d e f g h i j k l m n o p q r s t u v w x y z}
set list2 {a e i o u y}
set diff [lmap x $list1 {expr {[lsearch $list2 $x] < 0 ? $x : [continue]}}] 
# la valeur de $diff est {b c d f g h j k l m n p q r s t v w x z}

Cette solution permet d'améliorer ldiff car on peut facilement passer des paramètres à lsearch, comme l'option -nocase

Voir également

list, llength, lindex, lrange, linsert, lreplace, lappend, lsearch, concat, split, join, lsort, lrepeat, lset, Utilisation des listes, A propos des listes