Tcl - Espacios de nombres

El espacio de nombres es un contenedor para un conjunto de identificadores que se utiliza para agrupar variables y procedimientos. Los espacios de nombres están disponibles a partir de la versión 8.0 de Tcl. Antes de la introducción de los espacios de nombres, existía un único ámbito global. Ahora, con los espacios de nombres, tenemos particiones adicionales de alcance global.

Crear espacio de nombres

Los espacios de nombres se crean utilizando el namespacemando. A continuación se muestra un ejemplo simple para crear un espacio de nombres:

#!/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

Cuando se ejecuta el código anterior, produce el siguiente resultado:

33

En el programa anterior, puede ver que hay un espacio de nombres con una variable myResult y un procedimiento Add. Esto hace posible crear variables y procedimientos con los mismos nombres en diferentes espacios de nombres.

Espacios de nombres anidados

Tcl permite la anidación de espacios de nombres. A continuación se ofrece un ejemplo sencillo para anidar espacios de nombres:

#!/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

Cuando se ejecuta el código anterior, produce el siguiente resultado:

test1
test2

Importación y exportación de espacios de nombres

Como puede ver en los ejemplos de espacios de nombres anteriores, usamos muchos operadores de resolución de alcance y es más complejo de usar. Podemos evitar esto importando y exportando espacios de nombres. A continuación se da un ejemplo:

#!/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]

Cuando se ejecuta el código anterior, produce el siguiente resultado:

40

Olvidar el espacio de nombres

Puede eliminar un espacio de nombres importado utilizando forgetsubcomando. A continuación se muestra un ejemplo sencillo:

#!/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::*

Cuando se ejecuta el código anterior, produce el siguiente resultado:

40