{*}

 

Nouvel élement syntaxique en Tcl8.5, qui permet l'expansion (ou explosion?) d'une liste en ces éléments constituants. Aussi connu comme {expand} pendant la période alpha.

Pour plus d'explications voir les TIPs correspondants [1] [2], ou bien les pages du wiki anglophone [3] [4].


Une requête de justification à clt [5] engendre la justification suivante (un peu différente des antérieures):

Supposons que nous avons une commande dans $cmd, un premier argument dans $arg1, un tas d'autres arguments dans $argLst, et un dernier argument $argEnd. On pourrait faire

 eval $cmd $arg1 $argLst $argEnd

Mais ceci causera une erreur si les valeurs de $cmd ou $arg1 ou $argEnd contiennent des espaces. Ou un désastre si un clown quelconque écrit

 set arg1 {[exec rm -rf ~]}

Ah, il faut protéger de l'expansion tout ce qui doit être pris tel-quel:

 eval [list $cmd] [list $arg1] $argLst [list $argEnd]

ou bien

 eval [list $cmd $arg1] $argLst [list $argEnd]

Hmmm, pas très joli cette histoire de "protéger tout ce qui doit rester"; ne serait-ce pas mieux de marque ce qui doît être "expanded"? D'où:

 $cmd $arg1 {*}$argLst $argEnd

L'idée centrale est: l'idiome avec eval présente un tas d'erreurs faciles à commettre (écrire la première version), avec possiblement des implications de sécurité (evaluation de choses qui ne devraient pas être evaluées). Pas bon.

Donc, nouvel idiome qui permet de représenter ce que l'on veut directement (exploser $argLst en plusieurs termes), au lieu de ce que l'on avait jusque ici (exploser tous les arguments, sauf ceux qui sont protégés par list).