Quelqu'un peut il m'expliquer en quoi la nouvelle syntaxe {*} est
superieure a eval ?
- Dans le wiki, et dans le forum, une particularite de {*} mise en
avant est qu'il est plus "safe" qu'eval ? Je ne comprends pas ce que
ca veut dire ....
- Je ne pense pas que seule le changement d'ecriture de , par
exemple ,
destroy {*}[winfo children .]
a la place de
eval destroy [winfo children.]
soit une raison suffisante pour changer la syntaxe de Tcl.
Merci d'eclairer ma petite lanterne !!
lu- c
(1) {*} est plus performant, mais ce n'est pas important ici
(2) choisissons un example un peu plus compliqué pour illustrer:
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 {[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 son
protégés par [list]).
Miguel
Je crois que ca vaudrait la peine que tu copies tel quel ta reponse
pour en faire une page wiki .... Je ne crois pas etre le seul non-
informaticien qui utilise Tcl/Tk et qui se pose ce genre de
questions !
Merci encore !
Luc
Le wiki anglophone a une justification un peu différente
(http://wiki.tcl.tk/17158), provenant directement du TIP
(http://www.tcl.tk/cgi-bin/tct/tip/293.html,
http://www.tcl.tk/cgi-bin/tct/tip/157).
Le wiki francophone semble ne pas avoir de références à {*}! Quelqu'un
devrait s'y mettre, tout au moins avec des pointeurs à la page
anglophone, le TIP et peut-être cet échange?
Je le ferais moi-même, mais je semble avoir perdu mes droits (ou bien
oublié mon nom/pw :}). Ne pouvant pas le faire tout de suite, je crains
d'oublier.
Miguel
Bon, ca y est, droits retablis, tant que memoire est fraiche ;)
Eric
Zut alors - j'espérais bien qu'un autre s'y mette, mais t'es trop rapide.
Merci Eric. Pour quitter ma dette, http://wfr.tcl.tk/1559