Bonne pratique: la variable $args
#1
Lorsqu'on code une procédure, on utilise trop souvent args à mauvais escient en oubliant que c'est une variable magique.
en effet, si c'est le dernier argument d'une procédure, cette variable est une liste potentiellement vide (dans ce cas c'est une chaîne vide en fait) qui contiendra les arguments restants.

Un petit exemple est plus parlant:

tcl
% proc test {a1 {a2 "vide"} args} {
   puts "a1 = $a1 - a2 = $a2 - args = $args"
}
% test un
a1 = un - a2 = vide - args =
% test un deux
a1 = un - a2 = deux - args =
% test un deux trois
a1 = un - a2 = deux - args = trois
% test un deux trois quatre
a1 = un - a2 = deux - args = trois quatre


Il y a aussi un effet pervers: vous ne pouvez pas attribuer de valeur par défaut à $args:

tcl
% proc test2 {a1 {args "vide"}} {
   puts "a1 = $a1 - args = $args"
}
% test2 un
a1 = un - args =
% test2 un deux
a1 = un - args = deux
% test2 un deux trois
a1 = un - args = deux trois


Et en utilisant un autre nom de variable (text est très bien):

tcl
% proc test3 {a1 {a2 "vide"} text} {
   puts "a1 = $a1 - a2 = $a2 - text = $text"
}
% test3 un
wrong # args: should be "test3 a1 ?a2? text"
% test3 un deux trois
a1 = un - a2 = deux - text = trois
% test3 un deux trois quatre
wrong # args: should be "test2 a1 ?a2? text"
% test3 un deux "trois quatre"
a1 = un - a2 = deux - text = trois quatre


En conclusion, soyez exigeant avec vous-même sur le nommage des variables et faites très attention à l'utilisation de $args.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#2
J'insiste sur le fait que $args est une variable de type liste, donc à traiter comme telle.


tcl
% proc test {args} {
      puts [::tcl::unsupported::representation $args]
}
 
% test un deux trois quatre
value is a list with a refcount of 2, object pointer at 0x60ecdda40, internal representation 0x60d504320:0x0, no string representation

Toute l'actualité de mes scripts ici     (dernière mise à jour le 22/04/2020)

Tout programme comporte au moins un bug et pourrait être raccourci d'au moins une instruction, de quoi l'on peut déduire que tout programme peut être réduit à une seule instruction qui ne fonctionne pas.
  Reply
#3
Quand on parle de liste ont parle forcement des entre {}, j'en profite pour dire que le TCL n'ai pas du C ni du SH.
Je constate que souvent ont confond les {} et "". l'interprétation et l'évaluation est tout autres en TCL.

"" va évaluer tandis que {} va contenir, pour résumer de manière claire

Code:
set a "123"
a = 123
set b "$a";
b = 123
set c {$a}
c = $a
C'est pour ca que {args "vide"} ne fonctionne pas, c'est logique car args n'ai jamais vide au pire des cas c'est une 'liste vide' c'est a dire '{}' mais pas NULL, ni ""

args réagit comme une liste, une liste vide sans valeur vaut {}, il aura donc toujours un contenu (même vide).

Sont utilisation est recommandé dans le cas que les valeurs reçu dans la proc est dynamique (que le nombre de arguments varie) et que l'utilisation d'une liste est nécessaire derrière.

Il y a non sens de faire ceci :

tcl
proc maproc {nick host hand chan args} {
set subcmd [lindex $args 1]
set opts [lindex $args 2]
if { $opts == "" } { puts "options manquantes" }
}

Car vous créer une liste avec args que vous convertisse en string, vous utiliser deux fois la mémoire , car une mémoire est créer comme étant les éléments en liste et après en mémoire vous dupliqué l'informations en string et prolongé le temps d'exécution a coté.

il y a très peut de chance de devoir l'utiliser dans une proc(édure) qui obéit a un binds.
Il conviendra plus dans certains cas a des procédures 'fonctions'
Par exemple, imaginons une commandes/fonctions qui doit prendre plusieurs options

tcl
macommande TEXT ?options?


tcl
proc macommande { TEXT {options ""} } { ... }

dans ce macommande peut recevoir un string TEXT et aucune options, ou une, ou plusieurs. pour traité options il faudrait faire une boucle dessus pour compté les options et les traités car il est reçu comme string
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)