TCL/TK - Funções e procedimentos
Autor: Emanuel | Publicado: 2014-11-28T05:34:00-08:00


Procedimento é uma subrotina ou porção de código, que é executado a partir de um nome que o referencia. Uma função é um procedimento que retorna um valor.
Para entender melhor o que é uma função, vejamos o seguinte exemplo:&nbsp;

Desejamos calcular o quadrado de um número dado e imprimi-lo na tela:&nbsp;

proc quadrado {numero} {

&nbsp; &nbsp; &nbsp; return [expr $numero * $numero]

}

puts [quadrado 2]

Retornará 4 pois 2 vezes 2 é igual a 4. &nbsp;



Criando procedimentos e funções



Criamos procedimentos e funções através do comando proc. A sintaxe de proc e a seguinte:

proc nome {[argumento1] [argumento2]... [argumentoN]} {

&nbsp; &nbsp; &nbsp;[upvar nível variável_acima variável_local]

&nbsp; &nbsp; &nbsp;[global [variavel1] [variavel2]... [variavelN]

&nbsp; &nbsp; &nbsp;instruções...&nbsp;

&nbsp; &nbsp; &nbsp;[return [valor]]

}



Onde nome é o nome do procedimento ou função, argumento1, argumento2, argumentoN são argumentos ou valores opcionais passados ao procedimento ou função, variavel1, variavel2, variavelN são variaveis globais( ou seja variáveis vistas em todo o programa ), instruções são as instruções que serão executadas no procedimento ou função e valor é um valor que opcionalmente será retornado ao procedimento que chamou a função. O comando upvar será estudado mais adiante.



Argumentos



Argumentos são valores passados para a função ou procedimento. No caso do exemplo visto acima, do cálculo do quadrado de um número, número é o argumento passado à função quadrado. Argumentos podem ter valores default, ou padrão. Assim, caso nenhum valor seja passado para a função, um valor padrao será usado como argumento. Para definir um valor padrão para um argumento devemos colocar o nome do argumento e o valor padrão entre chaves {}, assim:

proc quadrado {{numero 0}} {

&nbsp; &nbsp; &nbsp;return [expr $numero * $numero]

}



Caso existam vários argumentos, cada argumento que possuir um valor padrão deverá vir entre chaves, assim:

proc nome {{argumento1 valor1} {argumento2 valor2}... {argumentoN valorN}} { ... }

Em muitos casos é importante fornecer valores padrões para os argumentos de uma função. Isso evitará erros de tempo de execução. Assim, estude bem suas funções e procedimentos.&nbsp;



Escopo das variáveis



Variáveis podem ser visíveis em todo o programa, ou somente em partes dele. A isso se dá o nome de escopo. Quando uma variável não pode ser vista em determinada parte do programa, se diz que ela está fora do escopo da função ou procedimento. &nbsp;

De um modo geral, variáveis criadas no interior de uma função ou procedimento, serão visíveis somente no interior da função ou procedimento onde foi criada. Para tornar uma variável visível em todo o programa, usa-se o comando global. Exemplo:

global código, nome, e-mail

Torna as variáveis código, nome e e-mail disponíveis para todo o programa.&nbsp;

Entretanto, para utilizar as variáveis acima dentro de uma outra função, você terá que repetir o mesmo comando acima dentro da função onde deseja utilizar as variáveis.&nbsp;

Muitas vezes entretanto, desejamos utilizar uma variável criada em um nível acima da nossa função, e não uma variável global. Nestes casos podemos utilizar o comando upvar, para criar um ponteiro para a nossa variável um ou mais níveis acima. Exemplo:&nbsp;

upvar 1 registro reg

Faz com que a variável reg referencie a variável registro que está na função chamadora( um nível acima ). Caso nível seja precedido pelo sinal #, nível será tratado como um valor absoluto. Assim #0 estará se referindo ao nível mais alto no programa.&nbsp;



Retornando valores



É possivel retornar valores de funções através do comando return, como visto no exemplo de introdução desta aula. Contudo, isso não é obrigatório.&nbsp;



Criando biblioteca de funções



Bibliotecas de funções são arquivos contendo declarações de diversas funções que queremos reaproveitar em nossos programas. Não há nenhum formato especial para arquivos de bibliotecas. &nbsp;

Para carregar uma biblioteca utilizamos o comando source. A sintaxe de source é:

source arquivo.tcl

Carregará a biblioteca

O comando source também pode ser usado para carregar programas inteiros em Tcl. Ao carregar um arquivo, source compilará e executará os comandos no arquivo.



Criando pacotes



Uma forma elegante de distribuir bibliotecas é colocando-as em pacotes. Um pacote é criado colocando um comando package provide no início do arquivo. A sintaxe de packageprovide é:&nbsp;

package provide nome versão

Onde nome é o nome do pacote( biblioteca ) que se está provendo e versão é o número da versão do pacote.&nbsp;

Para carregar um pacote coloque no ínicio de seu programa:

package require nome versão&nbsp;

Onde nome é o nome do pacote( biblioteca ) que se está solicitando e versão é o número da versão do pacote.&nbsp;

Para instalar um pacote em seu computador, crie um diretório, dentro do diretório das bibliotecas do Tcl, com o nome do pacote seguido da versão. Em seguida entre no diretório e execute o comando:&nbsp;

pkg_mkindex .

Isso criará um índice que Tcl utilizará para encontrar o pacote. Examine o diretório do Tcl em seu computador para entender melhor os nomes dos diretórios de pacotes.&nbsp;

O diretório das bibliotecas do Tcl no Windows é:&nbsp;

C:\Arquivos de Programas\Tcl\lib\&nbsp;

E no Linux, normalmente é:&nbsp;

/usr/lib/



Namespaces



Namespaces são a nova forma de encapsular variáveis e funções em bibliotecas e programas em Tcl. Trata-se de um tema avançado e difícil de entender para o iniciante.