Tcl - Namespaces

O namespace é um contêiner para um conjunto de identificadores usado para agrupar variáveis ​​e procedimentos. Os namespaces estão disponíveis a partir do Tcl versão 8.0. Antes da introdução dos namespaces, havia um único escopo global. Agora, com namespaces, temos partições adicionais de escopo global.

Criação de namespace

Os namespaces são criados usando o namespacecomando. Um exemplo simples de criação de namespace é mostrado abaixo -

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

Quando o código acima é executado, ele produz o seguinte resultado -

33

No programa acima, você pode ver que há um namespace com uma variável myResult e um procedimento Add. Isso possibilita a criação de variáveis ​​e procedimentos com os mesmos nomes em diferentes namespaces.

Namespaces aninhados

Tcl permite aninhamento de namespaces. Um exemplo simples de aninhamento de namespaces é fornecido abaixo -

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

Quando o código acima é executado, ele produz o seguinte resultado -

test1
test2

Importando e exportando namespace

Você pode ver nos exemplos anteriores de namespace, usamos muitos operadores de resolução de escopo e é mais complexo de usar. Podemos evitar isso importando e exportando namespaces. Um exemplo é dado abaixo -

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

Quando o código acima é executado, ele produz o seguinte resultado -

40

Esqueça o namespace

Você pode remover um namespace importado usando forgetsubcomando. Um exemplo simples é mostrado abaixo -

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

Quando o código acima é executado, ele produz o seguinte resultado -

40