Ceci fait suite à une conversation sur le canal anglophone #eggdrop.
Un utilisateur expliquait son souci:
Le code en question:
Il y a là de multiples erreurs de compréhension du fonctionnement de TCL.
Tout d'abord, args place dans une liste tous les arguments reçus et non déclarés.
Ensuite,
Donc, dans
La solution choisie par l'utilisateur est d'utiliser
La bonne pratique aurait été d'utiliser
Encore une fois, je rappelle qu'en TCL, il y a fort peu de différences entre listes et chaînes, et que cela peut provoquer des choses très étranges. Donc, maîtrisez vos types de données et n'utilisez pas l'un pour l'autre.
Un utilisateur expliquait son souci:
Citation :(traduction automatique, flemme)
<user> Pour ceux que ça intéresse concernant mon problème Tcl ci-dessus : il semblerait que ma liste « args » soit devenue une liste imbriquée {{a b}}, donc soit la fonction d’origine avait besoin d’une boucle « foreach » supplémentaire pour la parcourir, soit la fonction wrapper devait re-développer sa liste avant de l’utiliser dans la fonction d’origine (ce qui est heureusement facile maintenant avec l’opérateur {*}).
Le code en question:
tcl
proc replacehosts {handle args} {
setuser $handle HOSTS
foreach arg $args {
setuser $handle HOSTS $arg
}
}
proc ReplaceHosts {hand idx text} {
replacehosts [lindex $text 0] [lrange $text 1 end]
}
bind dcc n replacehosts ReplaceHosts
Il y a là de multiples erreurs de compréhension du fonctionnement de TCL.
Tout d'abord, args place dans une liste tous les arguments reçus et non déclarés.
Ensuite,
lrange fait un split sur le texte, et donc retourne une liste.Donc, dans
ReplaceHosts, l'appel de replacehosts est équivalent à faire replacehosts <machin> {host1 host2 host3}, et $args contient donc {{host1 host2 host3}}.La solution choisie par l'utilisateur est d'utiliser
{*}$args, perdant ainsi tout le bénéfice de recevoir une liste. Il pensait aussi à faire un double foreach, qui est une solution encore plus bancale imho.La bonne pratique aurait été d'utiliser
[join [lrange ...]] pour bien avoir un texte, et maitriser ce qui est passé à la procédure, plutôt que de tripoter la procédure réceptrice en ayant des assertions sur ce qu'elle reçoit.Encore une fois, je rappelle qu'en TCL, il y a fort peu de différences entre listes et chaînes, et que cela peut provoquer des choses très étranges. Donc, maîtrisez vos types de données et n'utilisez pas l'un pour l'autre.

