Namespace sans hard-codage
#1
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
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
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
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
putlog "v is now [set [namespace current]::v]"

Alors oui, ça complique tout de même le code mais il reste lisible.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#2
(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-)
  Reply
#3
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ù...
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#4
(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ù...

namespace export ?

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-)
  Reply
#5
(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é Surprised ?
C'est à ce qui me semble la bonne façon de faire.

Forcément, si tu vas sur #musique pour demander de l'aide...
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
#6
(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é Surprised ?
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 :)
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)