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:
Desejamos calcular o quadrado de um número dado e imprimi-lo na tela:
proc quadrado {numero} {
return [expr $numero * $numero]
}
puts [quadrado 2]
Retornará 4 pois 2 vezes 2 é igual a 4.
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]} {
[upvar nível variável_acima variável_local]
[global [variavel1] [variavel2]... [variavelN]
instruções...
[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}} {
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.
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.
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.
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.
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:
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.
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.
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.
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 é:
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.
Para carregar um pacote coloque no ínicio de seu programa:
package require nome versão
Onde nome é o nome do pacote( biblioteca ) que se está solicitando e versão é o número da versão do pacote.
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:
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.
O diretório das bibliotecas do Tcl no Windows é:
C:\Arquivos de Programas\Tcl\lib\
E no Linux, normalmente é:
/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.