[Tuto] liste, chaines, args...
#1
Ceci fait suite à une conversation sur le canal anglophone #eggdrop.

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.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)
Tchat 100% gratuit - Discutez en toute liberté - Transitionnez vers Linux - Discussions dans le Lauragais - Communauté LGBT respectueuse - soutien aux victimes de cybermalveillance - pour les filles par les filles