24/03/2022, 15:03 (This post was last modified: 24/03/2022, 15:07 by CrazyCat.)
Désolé pour le titre un peu abscons, je n'ai pas trouvé mieux.
Ce post fait suite à une problématique que j'ai rencontrée et exposée sur #eggdrop, mais là bas ils ne font que de l'aide pour les scripts mIRC donc je n'ai pas eu de réponse :) Heureusement qu'il y a d'autres endroits où l'on peut parler de TCL (essayez #musique sur zeolia.net, c'est de pros).
La problématique
Je fais un script avec un namespace mais pour des raisons de flexibilité, je ne veux pas utiliser d'appel avec son nom (myns dans le cas de l'exemple) mais avec namespace current. Et comme ce script contiendra des sous-modules, je dois aussi pouvoir utiliser namespace parent, mais la problématique est la même.
Ecrire une variable ou appeler une procédure est simple, voir la procédure doit dans le code exemple. Par contre, il est plus difficile de lire une variable.
Idem pour la question de la ligne supplémentaire, et je ne suis pas certain que ça fonctionne bien dans le sous-module (lorsque je veux accèder au parent).
La solution
Donnée par SpiKe^^, elle est celle qui me va le mieux:
(24/03/2022, 15:03)CrazyCat Wrote: Désolé pour le titre un peu abscons, je n'ai pas trouvé mieux.
Ce post fait suite à une problématique que j'ai rencontrée et exposée sur #eggdrop, mais là bas ils ne font que de l'aide pour les scripts mIRC donc je n'ai pas eu de réponse :) Heureusement qu'il y a d'autres endroits où l'on peut parler de TCL (essayez #musique sur zeolia.net, c'est de pros).
La problématique
Je fais un script avec un namespace mais pour des raisons de flexibilité, je ne veux pas utiliser d'appel avec son nom (myns dans le cas de l'exemple) mais avec namespace current. Et comme ce script contiendra des sous-modules, je dois aussi pouvoir utiliser namespace parent, mais la problématique est la même.
Ecrire une variable ou appeler une procédure est simple, voir la procédure doit dans le code exemple. Par contre, il est plus difficile de lire une variable.
tcl
Code:
namespace eval myns {
variable v
proc doit {} {
# Ceci marche très bien
incr [namespace current]::v 1
}
proc readit {} {
# Là je bloque
putlog "v is now $[namespace current]::v"
}
}
J'ai fait des tests en jouant avec les accolades, avec du eval, sans trop de résultats.
Les idées
Des solutions m'ont été données:
tcl
Code:
upvar 1 [namespace current]::v v
putlog "v is now $v"
Fonctionnel mais ça impose d'ajouter une ligne à chaque variable que la procédure utilisera et j'ai toujours des doutes sur le level à utiliser.
tcl
Code:
variable v
putlog "v is now $v"
Idem pour la question de la ligne supplémentaire, et je ne suis pas certain que ça fonctionne bien dans le sous-module (lorsque je veux accèder au parent).
La solution
Donnée par SpiKe^^, elle est celle qui me va le mieux:
tcl
Code:
putlog "v is now [set [namespace current]::v]"
Alors oui, ça complique tout de même le code mais il reste lisible.
Et si tu crée une proc pour faire l'appel au variable?
tcl
Code:
namespace eval myns {
variable v
Proc GetVars { v } { return [set [namespace current]::${v}] }
proc readit {} {
# Là je bloque (plus)
putlog "v is now [GetVars v]"
putlog "b is now [GetVars b]"
}
}
J'ai pas tester, mais c'est un peu plus lisible. ont peu aussi utiliser la fonction upvar dans GetVars
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-)
tu crées juste un alias, moi je donne le principe, libre à chacun de faire comme il veut.
Et ton alias a un petit souci (ou une lacune): si dans un sous-module (qui sera donc dans le NS myns::module) je veux récupérer une variable du-dit sous-module, il faut que GetVars soit aussi implémentée dans le sous-module (multiplication de code). Et il faudra aller attaquer [namespace parent]::GetVars pour avoir une variable du parent.
Ou bien if faut passer à GetVars des infos pour qu'il sache ce qu'il doit récupérer et où...
(24/03/2022, 17:45)CrazyCat Wrote: tu crées juste un alias, moi je donne le principe, libre à chacun de faire comme il veut.
Et ton alias a un petit souci (ou une lacune): si dans un sous-module (qui sera donc dans le NS myns::module) je veux récupérer une variable du-dit sous-module, il faut que GetVars soit aussi implémentée dans le sous-module (multiplication de code). Et il faudra aller attaquer [namespace parent]::GetVars pour avoir une variable du parent.
Ou bien if faut passer à GetVars des infos pour qu'il sache ce qu'il doit récupérer et où...
L'alias permet une visibilité/lecture plus simple et fonctionne pour toutes variables (nom), si il faut juste importer une fois la commande dans la proc ... c'est mieux de devoir faire appelle a chaque vars
putlog "v is now [set [namespace current]::v]" VS putlog "v is now [GetVars v]"
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-)
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.
(24/03/2022, 18:02)ZarTek Wrote: L'alias permet une visibilité/lecture plus simple et fonctionne pour toutes variables (nom), si il faut juste importer une fois la commande dans la proc ... c'est mieux de devoir faire appelle a chaque vars
putlog "v is now [set [namespace current]::v]" VS putlog "v is now [GetVars v]"
Je n'ai jamais dit le contraire. Je dis juste que quand je suis dans ::myns::module, c'est pas pratique d'aller chercher $::myns::a et $::myns::module::b
(24/03/2022, 18:14)MenzAgitat Wrote:
(24/03/2022, 15:03)CrazyCat Wrote:
Code:
putlog "v is now [set [namespace current]::v]"
Alors oui, ça complique tout de même le code mais il reste lisible.
C'est compliqué ?
C'est à ce qui me semble la bonne façon de faire.
C'est un peu moins lisible ;)
(24/03/2022, 18:14)MenzAgitat Wrote: Forcément, si tu vas sur #musique pour demander de l'aide...
J'ai pas trouvé de canal plus pratique sur l'aide eggdrop :)