Procedimento e uma subrotina ou porcao de codigo, que e executado a partir de um nome que o referencia. Uma funcao e um procedimento que retorna um valor.Para entender melhor o que e uma funcao, vejamos o seguinte exemplo: Desejamos calcular o quadrado de um numero dado e imprimi-lo na tela: proc quadrado {numero} { return [expr $numero * $numero]}puts [quadrado 2]Retornara 4 pois 2 vezes 2 e igual a 4. Criando procedimentos e funcoesCriamos procedimentos e funcoes atraves do comando proc. A sintaxe de proc e a seguinte:proc nome {[argumento1] [argumento2]... [argumentoN]} { [upvar nivel variavel_acima variavel_local] [global [variavel1] [variavel2]... [variavelN] instrucoes... [return [valor]]}Onde nome e o nome do procedimento ou funcao, argumento1, argumento2, argumentoN sao argumentos ou valores opcionais passados ao procedimento ou funcao, variavel1, variavel2, variavelN sao variaveis globais( ou seja variaveis vistas em todo o programa ), instrucoes sao as instrucoes que serao executadas no procedimento ou funcao e valor e um valor que opcionalmente sera retornado ao procedimento que chamou a funcao. O comando upvar sera estudado mais adiante.ArgumentosArgumentos sao valores passados para a funcao ou procedimento. No caso do exemplo visto acima, do calculo do quadrado de um numero, numero e o argumento passado a funcao quadrado. Argumentos podem ter valores default, ou padrao. Assim, caso nenhum valor seja passado para a funcao, um valor padrao sera usado como argumento. Para definir um valor padrao para um argumento devemos colocar o nome do argumento e o valor padrao entre chaves {}, assim:proc quadrado {{numero 0}} { return [expr $numero * $numero]}Caso existam varios argumentos, cada argumento que possuir um valor padrao devera vir entre chaves, assim:proc nome {{argumento1 valor1} {argumento2 valor2}... {argumentoN valorN}} { ... }Em muitos casos e importante fornecer valores padroes para os argumentos de uma funcao. Isso evitara erros de tempo de execucao. Assim, estude bem suas funcoes e procedimentos. Escopo das variaveisVariaveis podem ser visiveis em todo o programa, ou somente em partes dele. A isso se da o nome de escopo. Quando uma variavel nao pode ser vista em determinada parte do programa, se diz que ela esta fora do escopo da funcao ou procedimento. De um modo geral, variaveis criadas no interior de uma funcao ou procedimento, serao visiveis somente no interior da funcao ou procedimento onde foi criada. Para tornar uma variavel visivel em todo o programa, usa-se o comando global. Exemplo:global codigo, nome, e-mailTorna as variaveis codigo, nome e e-mail disponiveis para todo o programa. Entretanto, para utilizar as variaveis acima dentro de uma outra funcao, voce tera que repetir o mesmo comando acima dentro da funcao onde deseja utilizar as variaveis. Muitas vezes entretanto, desejamos utilizar uma variavel criada em um nivel acima da nossa funcao, e nao uma variavel global. Nestes casos podemos utilizar o comando upvar, para criar um ponteiro para a nossa variavel um ou mais niveis acima. Exemplo: upvar 1 registro regFaz com que a variavel reg referencie a variavel registro que esta na funcao chamadora( um nivel acima ). Caso nivel seja precedido pelo sinal #, nivel sera tratado como um valor