Communauté Eggdrop

Version complète : Pb d'import/export avec les namespace
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour,

J'essayes de me mettre aux namespace et je rencontre une difficulté pour importer des commandes d'un autre namespace.

Voici le script qui contient les commandes à exporter:

tcl
namespace eval sqlcmd {
	package provide sqlcmd
	namespace export sqlconnect sqlclose 
	proc sqlconnect { db } {
		return [mysqlconnect -socket $sqlcmd::connect(sock) -user $sqlcmd::connect(user) -password $sqlcmd::connect(pass) -db $sqlcmd::connect($db)]
	}
	proc sqlclose { handle } {
		mysqlendquery $handle
		mysqlclose $handle
	}
}



Et voici le tcl dans lequel j'essayes d'importer les commandes

tcl
package require sqlcmd
namespace eval monscript {
	namespace import sqlcmd::sqlconnect sqlcmd::sqlclose
	set handle [sqlconnect test]
putlog $handle
	sqlclose
}



Losque que je démarre le bot, j'ai ce message d'erreur :
Code :
[10:18] unknown namespace in import pattern "sqlcmd::sqlconnect"
    while executing
"namespace import sqlcmd::sqlconnect"
    (in namespace eval "::myscript" script line 7)
Lorsque tu es dans un namespace et que tu veux adresser un autre namespace extérieur, tu dois spécifier le chemin absolu et non relatif.

La commande suivante va chercher un namespace du nom de sqlcmd dans ton namespace monscript, ce qui explique pourquoi il ne le trouve pas :
tcl
namespace import sqlcmd::sqlconnect


La syntaxe correcte est :
tcl
namespace import ::sqlcmd::sqlconnect


Vois les :: comme des / dans un chemin de répertoires, ça fonctionne pareil.
J'avais déjà fait le rapprochement des :: avec les / des répertoires, mais dans ma tête l'import/export se faisait au niveau du namespace global et non dans le namespace ou la commande est appelée donc bêtement je n'avais pas mis les :: et cette notion de namespace étant nouvelle pour moi je n'ai pas encore appréhendé entièrement la chose, par contre j'en ai bien cerné l'intérêt :)

Merci :)
Encore une petite question avec les namespace,

Lors de l'utilisation des variable déclarée dans le namespace, comme ceci par exemple :

tcl
namespace eval monscript {
   variable test "un test"
   bind pub - !test monscript::test
 
   proc test { nick host handle chan args } {
     putserv "privmsg $chan :$monscript::test"
   }
}



Je dois impérativement appeler la variable en préfixant son nom avec le namespace ou y'a-t-il un moyen de l'appeler sans le préfixe étant donné qu'elle est utilisée à l'intérieur de son namespace ?
soit tu l'appelles par $monscript::test, soit tu mets une ligne variable test au début de chaque procédure qui utilise la variable afin de l'importer et de pouvoir l'appeler $test ensuite :

tcl
namespace eval monscript {
   variable test "un test"
   bind pub - !test monscript::test
 
   proc test { nick host handle chan args } {
     putserv "privmsg $chan :$monscript::test"
   }
}


ou
tcl
namespace eval monscript {
   variable test "un test"
   bind pub - !test monscript::test
 
   proc test { nick host handle chan args } {
     variable test
     putserv "privmsg $chan :$test"
   }
}


Ok je n'avais pas compris que l'on pouvait utiliser "variable" exactement comme la fonction "global"