Tcl - Espaces de noms

L'espace de noms est un conteneur pour un ensemble d'identificateurs utilisé pour regrouper des variables et des procédures. Les espaces de noms sont disponibles à partir de la version 8.0 de Tcl. Avant l'introduction des espaces de noms, il n'existait qu'une seule portée globale. Maintenant, avec les espaces de noms, nous avons des partitions supplémentaires de portée globale.

Créer un espace de noms

Les espaces de noms sont créés à l'aide du namespacecommander. Un exemple simple de création d'espace de noms est présenté ci-dessous -

#!/usr/bin/tclsh

namespace eval MyMath {
  # Create a variable inside the namespace
  variable myResult
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
  set ::MyMath::myResult [expr $a + $b]
}
MyMath::Add 10 23

puts $::MyMath::myResult

Lorsque le code ci-dessus est exécuté, il produit le résultat suivant -

33

Dans le programme ci-dessus, vous pouvez voir qu'il y a un espace de noms avec une variable myResult et une procédure Add. Cela permet de créer des variables et des procédures avec les mêmes noms sous différents espaces de noms.

Espaces de noms imbriqués

Tcl permet l'imbrication des espaces de noms. Un exemple simple d'imbrication d'espaces de noms est donné ci-dessous -

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
}

namespace eval extendedMath {
   # Create a variable inside the namespace
   namespace eval MyMath {
      # Create a variable inside the namespace
      variable myResult
   }
}
set ::MyMath::myResult "test1"
puts $::MyMath::myResult
set ::extendedMath::MyMath::myResult "test2"
puts $::extendedMath::MyMath::myResult

Lorsque le code ci-dessus est exécuté, il produit le résultat suivant -

test1
test2

Importation et exportation d'espace de noms

Vous pouvez voir dans les exemples d'espaces de noms précédents, nous utilisons beaucoup d'opérateurs de résolution de portée et c'est plus complexe à utiliser. Nous pouvons éviter cela en important et en exportant des espaces de noms. Un exemple est donné ci-dessous -

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
   namespace export Add
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
   return [expr $a + $b]
}

namespace import MyMath::*
puts [Add 10 30]

Lorsque le code ci-dessus est exécuté, il produit le résultat suivant -

40

Oublier l'espace de noms

Vous pouvez supprimer un espace de noms importé en utilisant forgetsous-commande. Un exemple simple est présenté ci-dessous -

#!/usr/bin/tclsh

namespace eval MyMath {
   # Create a variable inside the namespace
   variable myResult
   namespace export Add
}

# Create procedures inside the namespace
proc MyMath::Add {a b } {  
   return [expr $a + $b]
}
namespace import MyMath::*
puts [Add 10 30]
namespace forget MyMath::*

Lorsque le code ci-dessus est exécuté, il produit le résultat suivant -

40