Communauté sur les Eggdrops - Community about Eggdrops
msgcat, utimer et namespace, trio perdant ? - Printable Version

+- Communauté sur les Eggdrops - Community about Eggdrops (https://forum.eggdrop.fr)
+-- Forum: Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum: Scripts TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=4)
+--- Thread: msgcat, utimer et namespace, trio perdant ? (/showthread.php?tid=1919)



msgcat, utimer et namespace, trio perdant ? - CrazyCat - 12/04/2022

Hello,

Je vous expose ici un petit souci que je rencontre et qui est particulièrement embêtant: j'ai un script qui contient un namespace et qui utilise msgcat. Enfin, c'est anecdotique, le souci existe même avec une variable simple. utimer semble faire perdre le namespace:

Code qui fonctionne sans souci (la variable est immédiatement interprétée):

tcl
namespace eval ns1 {
   variable m1 "toto le héros"
   list [utimer 5 {putlog "$::ns1::m1"}]
}
# [13:31] toto le héros


Code qui ne fonctionne pas:

tcl
namespace eval ns1 {
   variable m1 "toto le héros"
   list [utimer 5 {putlog "[set [namespace current]::m1]"}]
}
# [13:32] Tcl error in script for 'timer28':
# [13:32] can't read "::::m1": no such variable

Et du coup le souci existe aussi avec msgcat qui stocke les phrases dans un catalogue propre au namespace, la phrase n'est pas retrouvée.

Je suis preneur de toute idée pour ne plus subir ce souci (j'ai quelques idées, je dois les tester).


RE: msgcat, utimer et namespace, trio perdant ? - CrazyCat - 12/04/2022

Petite auto-réponse (en fait de SpiKe^^) pour aider ceux qui auraient le souci.
Ma syntaxe pour le timer n'était pas la meilleure:

tcl
utimer 5 [list putlog "[set [namespace current]::m1]"]




RE: msgcat, utimer et namespace, trio perdant ? - ZarTek - 12/04/2022

La raison est que tu utilise {} tout ce qui est entre est évaluer par TCL au déclenchement de utimer, et non dans le namespace actuel de ton code.
Le utimer étant lancer dans son namepsace, celui ci n'ai pas exécuté a l'emplacement dans ton code mais dans son propre environnement ( namspace :: et non ::ns1)

Tandis que dans la méthode SpiKe^^ le putlog contient déjà le contenu du m1 en utilisant le namespace là ou tu le place dans le code.


tcl
<@ZarTek>· .tcl set ::a "mavaleuractuel"; list [utimer 5 "putserv \"PRIVMSG #chan: [set ::a]\""]; set ::a "valeur_apres_lancement_utimer";
<BOT> OK - 0.089 ms
<@BOT>  mavaleuractuel
<@ZarTek>· .tcl set ::a "mavaleuractuel"; list [utimer 5 {putserv "PRIVMSG #chan: [set ::a]"}]; set ::a "valeur_apres_lancement_utimer";
<@BOT> OK - 0.063 ms
<@BOT>  valeur_apres_lancement_utimer


Cela peut être intéressant si tu as besoin de la valeur de ::a lors de la déclaration ou lors de l'exécution de utimer.

Perso j'utilise le list dans utimer comme ceci:

tcl
<@ZarTek>· .tcl set ::a "mavaleuractuel"; utimer 5 [list putserv "PRIVMSG #chan: [set ::a]"]; set ::a "valeur_apres_lancement_utimer";
<@BOT> OK - 0.087 ms
<@BOT>  mavaleuractuel