:TITLE: Atribuição de valores a variáveis
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl2.lsn,v 1.13 2000/04/24 16:17:51 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 21/12/2005
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
<CODE>set</CODE> é o operador de atribuição em Tcl.
<P>
Tcl armazena dados como strings, e só os converte para números quando necessário.
<P>
Quando há uma referência a uma variável por valor, o nome é precedido por um <B>$</B>.
Quando há uma referência para a variável por referência, o $ não é colocado.
<P>
O argumento para o comando <CODE>set</CODE> deve ser passado por referência, 
então isso é chamado com simplesmente um nome da variável, e não se usa $.
<P>
O comando <CODE>puts</CODE> permite que dados sejam passados por valor. Nesse 
caso, você chama <CODE>puts</CODE> com um $ antes do nome da variável.
<DL>
<B><DT>set</B> <I>nomeVariavel ?valor?</I>
<DD>Se <I>valor</I> é especificado, então o conteúdo da variável 
<I>nomeVariavel</I> terá o mesmo valor que <I>valor</I>.  
<P>
Se <I>nomeVariavel</I> consiste apenas de caracteres alfanuméricos, 
sem parênteses, essa é uma variável escalar.
<P>
Se <I>nomeVariavel</I> tem a forma <I>nomeVariavel(índice)</I>, esse é um 
membro de um vetor associativo.
<P>
<B>set</B> retorna o valor da variável <I>nomeVariavel</I>.
</DL>
:TEXT_END:
<P>
:LESSON_TEXT_START_LEVEL 1:
Tcl armazena dados como strings, e só os converte para números quando necessário 
para cálculos ou comparações.
<P>
O operador de atribuição em Tcl é <CODE>set</CODE>.
<P>
Quando <B>set</B> é chamado com dois argumentos, como em:
<PRE><CODE>
set verdura Couve-flor
</CODE></PRE>
ele coloca o segundo argumento (<I>"Couve-flor"</I>) no espaço de memória 
referenciado pelo primeiro argumento (<I>verdura</I>). <B>set</B> sempre 
retorna o conteúdo da variável nomeada no primeiro argumento. Portanto, 
quando <B>set</B> é chamado com dois argumentos, ele coloca o segundo 
argumento no espaço de memória referenciado pelo primeiro argumento e então 
retorna o segundo argumento.
<P>
O primeiro argumento para um comando <B>set</B> pode ser ou uma única palavra, 
como <B>verdura</B> ou <B>pi</B>, ou ele pode ser um membro de um vetor. 
Vetores serão discutidos em maiores detalhes mais tarde, mas, por agora, 
apenas se lembre que muitos dados podem ser coletados sob o nome de uma 
única variável, e um dado individual pode ser acessado pelo seu índice 
dentro daquele vetor. A indexação em um vetor Tcl é manipulada colocando 
o índice dentro de parênteses depois do nome da variável.
<P>
<B>set</B> pode também ser chamado com apenas um argumento. Nesse 
caso, ele retornará o conteúdo daquele argumento.
<P>
Aqui está um resumo do comando <B>set</B>. Examine-o, então clique 
no botão <B>Executar exemplo</B>, e estude a saída enquanto você 
continua a leitura desse texto.
<DL>
<B><DT>set</B> <I>nomeVariavel ?valor?</I>
<DD>Se <I>valor</I> é especificado, então o conteúdo da variável 
<I>nomeVariavel</I> é o mesmo do <I>valor</I>.
<P>
Se <I>nomeVariavel</I> consiste apenas de caracteres alfanuméricos, 
sem parênteses, essa é uma variável escalar.
<P>
Se <I>nomeVariavel</I> tem a forma <I>nomeVariavel(índice)</I>, 
esse é um membro de um vetor associativo.
<P>
<B>set</B> retorna o valor da variável <I>nomeVariavel</I>.
</DL>
<P>
Se você observar no código do exemplo, você irá perceber que no comando 
<CODE>set</CODE> o primeiro argumento é digitado apenas com seu nome, mas 
na declaração com <CODE>puts</CODE> o argumento é precedido com um <B>$</B>. 
<P>
Isso é porque Tcl passa dados para subrotinas, ou por referência, ou por valor. 
Comandos que não mudam o conteúdo de uma variável normalmente têm seus 
argumentos passados por valor. Comandos que <B>MUDAM</B> o valor de um dado 
devem ser passados por referência.
<P>
Novamente, modifique o script do exemplo um pouco, e então clique na próxima lição.
:TEXT_END:
<P>
:LESSON_TEXT_START_LEVEL 2:
De maneira a tornar uma linguagem de programação útil, você precisa ter uma 
forma para armazenar e acessar dados em um programa. Para fazer isso, você 
aloca espaço na memória do computador e coloca o dado que você deseja 
trabalhar naquele espaço. O dado pode ser qualquer coisa, de uma massa 
de um nêutron a um poema sobre o Jabberwock. O importante é que isso é 
colocado na memória do computador, e que há uma forma para adquirir isso 
quando você quiser.
<P>
Em Tcl, esse espaço é reservado para você toda vez que você coloca dados 
em uma variável, e você acessa o dado que você colocou naquele espaço 
através do nome da variável.
<P>
Para criar uma variável e colocar algum dado nela, nós usamos o comando 
<CODE>set</CODE>. 
<P>
Quando <B>set</B> é chamado com dois argumentos, como em:<PRE><CODE>
set verdura Couve-flor
</CODE></PRE>
ele coloca o segundo argumento (<I>Couve-flor</I>) no espaço de memória 
referenciado pelo primeiro argumento (<I>verdura</I>). <B>set</B> sempre 
retorna o conteúdo da variável nomeada no primeiro argumento. Portanto, 
quando <B>set</B> é chamado com dois argumentos, ele coloca o segundo 
argumento no espaço de memória referenciado pelo primeiro argumento e, 
então, retorna o valor do segundo argumento.
<P>
O primeiro argumento para um comando <B>set</B> pode ser ou uma única 
palavra, como <B>verdura</B> ou <B>pi</B>, ou pode ser um membro de 
um vetor. Vetores serão discutidos em maiores detalhes mais tarde, mas, 
por agora, basta lembrar que muitos dados podem ser coletados sob o 
nome de uma única variável, e um dado individual pode ser acessado pelo 
seu índice dentro daquele vetor. A indexação em um vetor em Tcl é 
manipulada colocando o índice dentro de parênteses depois do nome da variável.
<P>
<B>set</B> pode também ser chamado com apenas um argumento. Neste caso, 
ele retornará o conteúdo daquele argumento.
<P>
Aqui está uma parte da página do manual para resumir de que forma o 
comando <B>set</B> se comporta:
<DL>
<B><DT>set</B> <I>nomeVariavel ?valor?</I>
<DD>Se <I>valor</I> é especificado, então o conteúdo da variável 
<I>nomeVariavel</I> é o mesmo do <I>valor</I>.
<P>
Se <I>nomeVariavel</I> consiste apenas de caracteres alfanuméricos, 
sem parênteses, essa é uma variável escalar.
<P>
Se <I>nomeVariavel</I> tem a forma <I>nomeVariavel(índice)</I>, 
esse é um membro de um vetor associativo.
<P>
<B>set</B> retorna o valor da variável <I>nomeVariavel</I>.
</DL>
<P>
Clique no botão <B>Executar exemplo</B>, e estude a saída enquanto você continua 
a leitura deste texto.
<P>
Se você observar o código do exemplo, você irá perceber que no comando 
<CODE>set</CODE> o primeiro argumento é digitado com apenas o seu nome, 
enquanto na declaração com <CODE>puts</CODE> o argumento é precedido com um <B>$</B>. 
<P>
Algumas vezes quando você passa o conteúdo de uma variável para uma subrotina, 
você quer permitir à subrotina modificar o dado se isso for necessário, 
mas sem afetar a cópia principal. Neste caso, você coloca um $ antes do 
nome da variável quando você chama a subrotina. Fazendo isso, ocorre uma 
reserva de um novo espaço na memória e uma cópia do conteúdo da variável. 
A subrotina é chamada com essa cópia do dado, e pode fazer qualquer coisa 
que seja necessária, como processar o dado. Quando isso é feito, a cópia 
original do dado está intacta ainda. Isso é chamado "Passagem por Valor", 
desde que o valor da variável seja passado para a subrotina.
<P>
Outras vezes (tais como no comando <CODE>set</CODE>), você quer que o 
contéudo da variável seja alterado. Neste caso, você que passar uma 
referência para a localização na memória onde aquele dado da variável 
está armazenado, para que aquele comando possa modificar aquele dado 
nessa localização. Em Tcl, isso *NÃO* é feito colocando um sinal de $ 
antes do nome da variável. Isso é chamado "Passagem por Referência", 
desde que a referência para a localização seja passada para o comando.
<P>
Então, com o comando <CODE>set</CODE> você pode simplesmente usar o 
nome da variável, para que aquela referência seja passada para 
<CODE>set</CODE>.  <CODE>set</CODE> coloca o dado no segundo argumento 
na localização referenciada pelo primeiro argumento.
<P>
Todavia, como no comando <CODE>puts</CODE>, nós não queremos qualquer 
chance de mudança dos dados originais. Então nós chamamos <CODE>puts</CODE> 
por valor, e fornecemos a ele uma cópia limpa do dados para a saída.
<P>
Novamente, modifique o script do exemplo um pouco, e então clique na próxima lição.
:TEXT_END:
<P>
:CODE_START:
;# Atribuição de uma string à variável X
set X "Isso é uma string"

;# Atribuição de um número à variável Y
set Y 1.24

;# Exibe o conteúdo de X e Y
puts $X
puts $Y

;# Apenas coloca um separador
puts "..............................."

;# Mais de um item pode ser colocado em um único puts
set rotulo "O valor em Y é:"
puts "$rotulo $Y"
:TEXT_END:
<P>


