Ceci est un cas simplifié d'un problème. J'essaye de copier une procédure à un espace de noms, de sorte qu'il utiliserait le contexte du propre espace de noms. En utilisant l'importation ne fonctionne pas (probablement parce qu'il crée simplement des alias) Voir le code ci-dessous:Copier un proc dans un espace de nom dans TCL
proc me_namespace {} {
puts "namespace is:[namespace current]"
puts "called namespace is:[uplevel 1 namespace current ]"
}
namespace eval foo {} {
me_namespace
puts "Now import"
namespace import ::::me_namespace
me_namespace
}
La sortie de code est:
namespace is:::
called namespace is:::foo
Now import
namespace is:::
called namespace is:::foo
namespace is:::foo
Idéalement, le proc me_namespace sortie 1ère ligne, après la copie, si être:
::::me_namespace
Des idées? La seule chose à laquelle je peux penser est d'avoir les définitions de procédures dans un fichier, puis de lire le fichier et d'utiliser eval, mais je cherchais quelque chose de plus élégant. La raison pour laquelle je ne suis pas simplement utiliser uplevel
, est que parfois (en particulier lors de l'utilisation variable
avec uplevel
est que le temps d'exécution, une fois, est beaucoup trop lent. Version TCL est 8.6
La page de manuel de l'espace de noms (http://www.tcl.tk/man/tcl/TclCmd/namespace.htm) indique que l'importation ne fonctionne que sur les commandes exportées. Vous devez exporter la commande. J'ai essayé ceci et fonctionne ':: foo :: me_namespace'. Mais pourquoi auriez-vous besoin d'importer une procédure dans l'espace de noms global? –
Il semble que vous implémentez une sorte de POO à l'aide d'espaces de noms. Avez-vous considéré TclOO? –