Lmap
lmap - Itére sur tous les éléments d'une ou plusieurs listes et collecte les résultats
Contents
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