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