:TITLE: Estruturas de Dados em Tcl 101 - A lista
;#
;# RCSID: $Header: /home/cvs/TclTutor3/lesson/Tcl_Portuguese/Tcl_Portuguese14.lsn,v 1.1 2008/08/02 12:37:36 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: 03/01/2006
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
A lista é a estrutura de dados básica em Tcl. Uma lista é simplesmente
um coleção ordenada de coisas: números, palavras, strings, etc. Por exemplo,
um comando em Tcl é apenas uma lista na qual a primeira entrada dessa lista
é o nome de um proc, e os membros subseqüentes da lissta são os argumentos
do proc.
<P>
Listas podem ser criadas de muitas formas:
<UL>
<LI>indicando uma variável para ser uma lista de valores;
<LI>com o comando <B>split</B>;
<LI>com o comando <B>list</B>.
</UL>
<P>
O número de elementos na lista será retornado pelo comando <CODE>llength</CODE>.
Um membro individual da lista pode ser acessado com o comando <CODE>lindex</CODE>.
<P>
Uma breve descrição desses comandos:
<DL>
<B><DT>list</B> <I>?arg1 arg2 ...?</I>
<DD> cria uma lista de argumentos
<B><DT>split</B> <I>string ?CaracteresSplit?</I>
<DD> Separa a <I>string</I> nos <I>CaracteresSplit</I>.  O padrão para os
<I>CaracteresSplit</I> são os espaços em branco (espaços, tabulações,
caracteres de nova linha). Note que dois dos <I>CaracteresSplit</I> em 
uma linha serão tratados como marcação de
uma entrada na lista, e será criada uma entrada vazia na lista.
<B><DT>lindex</B> <I>lista índice</I>
<DD> retorna o item indexado pelo <I>índice</I> da lista. O primeiro item é 0.
<B><DT>llength</B> <I>lista</I>
<DD>Retorna o número de elementos na lista.
</DL>
<P>
Os itens na lista podem ser iterados um a um utilizando o comando <CODE>foreach</CODE>.
<P>
<B>foreach</B> <I>nomeVar lista corpo</I>
<P>
<CODE>Foreach</CODE> irá executar o código do <I>corpo</I> 
uma vez para cada item na <I>lista</I>. Em cada passo, <I>nomeVar</I> 
irá conter o valor do próximo item da <I>lista</I>.

:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
A lista é a estrutura de dados básica em Tcl. Uma lista é simplesmente
uma coleção ordenada de coisas: números, palavras, strings, etc. Por exemplo,
um comando em Tcl é apenas uma lista na qual a primeira entrada dessa lista
é o nome de um proc, e os membros subseqüentes da lista são os argumentos
do proc.
<P>
Listas podem ser criadas de muitas maneiras:
<DL>
<DT>Indicando uma variável para ser uma lista de valores:
<DD> set lst {{item 1} {item 2} {item 3}}
<DT>Com o comando <B>split</B>:
<DD> set lst [split "item 1.item 2.item 3" "."]
<DT>Com o comando <B>list</B>:
<DD> set lst [list "item 1" "item 2" "item 3"]
</DL>
<P>
Um membro individual de uma lista pode ser acessado com
o comando <CODE>lindex</CODE>.
<P>
Uma breve descrição desses comandos:
<DL>
<B><DT>list</B> <I>?arg1 arg2 ...?</I>
<DD> cria uma lista de argumentos
<B><DT>split</B> <I>string ?CaracteresSplit?</I>
<DD> Separa a <I>string</I> em uma lista de itens separados pelos <I>CaracteresSplit</I>. 
O padrão para <I>CaracteresSplit</I> são os espaços em branco
(espaços, tabulações, caracteres de nova linha). Note que se há dois
<I>CaracteresSplit</I> em uma linha, na string a ser separada, então cada um
será tratado como marcação de uma entrada da lista, e será criada uma entrada
vazia na lista. Se <I>CaracteresSplit</I> for uma string, então cada membro da
string será usado para separar a <I>string</I> em membros da lista.
Isto é:<PRE> <CODE>split "1234567" "36"</CODE></PRE>
originaria uma lista composta de <CODE>{12 45 7}</CODE>.
<B><DT>lindex </B><I> lista índice</I>
<DD>Retorna o item indexado pelo <I>índice</I> da lista. O primeiro item é 0.
<B><DT>llength</B> <I>lista</I>
<DD>Retorna o número de elementos na lista.
</DL>
<P>
Os itens na lista podem ser iterados um a um utilizando o comando <CODE>foreach</CODE>.
<P>
<B>foreach</B> <I>nomeVar lista corpo</I>
<P>
<CODE>Foreach</CODE> irá executar o código do <I>corpo</I> uma vez
para cada item na <I>list</I>. Em cada passo, <I>nomeVar</I> irá conter
o valor do próximo item da <I>lista</I>.
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
A lista é a estrutura de dados básica em Tcl. Uma lista é
simplesmente uma coleção ordenada de coisas: números, palavras,
strings, etc. Cada entrada na lista é tratada como uma única unidade,
mesmo se essa entrada for composta de muitas palavras ou mesmo múltiplas
linhas de texto. Por exemplo, um comando em Tcl é uma lista na qual
a primeira entrada na lista é o nome de um comando, e os membros
subseqüentes da lista são os argumentos para o comando.
<P> 
As entradas em uma lista são separadas por espaço em branco. Se uma
entrada tem um espaço em branco dentro dela, então aquela entrada será
delimitada por chaves para indicar uma única entrada. Uma entrada de
lista vazia é denotada por um par de chaves sem nada entre elas ({}).
<P>
Listas podem ser criadas de muitas maneiras:
<DL>
<DT>Indicando uma variável para ser uma lista de valores:
<DD> set lst {{item 1} {item 2} {item 3}}
<DT>Com o comando <B>split</B>:
<DD> set lst [split "item 1.item 2.item 3" "."]
<DT>Com o comando <B>list</B>:
<DD> set lst [list "item 1" "item 2" "item 3"]
</DL>
<P>
Um membro individual de uma lista pode ser acessado com
o comando <CODE>lindex</CODE>.
<P>
Uma breve descrição desses comandos:
<DL>
<B><DT>list</B> <I>?arg1 arg2 ...?</I>
<DD> cria uma lista de argumentos
<B><DT>split</B> <I>string ?CaracteresSplit?</I>
<DD> Separa a <I>string</I> em uma lista de itens separados pelos <I>CaracteresSplit</I>. 
O padrão para <I>CaracteresSplit</I> são os espaços em branco (espaços, tabulações,
caracteres de nova linha). Note que se há dois <I>CaracteresSplit</I> 
em uma linha, na string a ser separada, então cada um
será tratado como marcação de uma entrada da lista, e será criada uma entrada
vazia na lista. Se <I>CaracteresSplit</I> for uma string, então cada membro da
string será usado para separar a <I>string</I> em membros da lista.
Isto é:<PRE> <CODE>split "1234567" "36"</CODE></PRE>
originaria uma lista composta de <CODE>{12 45 7}</CODE>.
<B><DT>lindex </B><I> lista índice</I>
<DD>Retorna o item indexado pelo <I>índice</I> da lista. O primeiro item é 0.
<B><DT>llength</B> <I>lista</I>
<DD>Retorna o número de elementos na lista.
</DL>
<P>
Os itens na lista podem ser iterados um a um utilizando o comando <CODE>foreach</CODE>.
<P>
<B>foreach</B> <I>nomeVar lista corpo</I>
<P>
<CODE>Foreach</CODE> irá executar o código do <I>corpo</I> uma vez
para cada item na <I>lista</I>. Em cada passo, <I>nomeVar</I> irá conter
o valor do próximo item da <I>lista</I>.
<P>
O exemplo de código a seguir é equivalente ao comando <CODE>foreach</CODE>:
<PRE><CODE>
for {set i 0} {$i < [llength $x]} {incr i} {
  puts "[lindex $x $i] é o item número $i na lista x"
  }
</PRE></CODE>
O comando <CODE>foreach</CODE> executa duas vezes mais rápido que
o comando <CODE>for</CODE> neste exemplo. Essa é uma boa razão para
usar o <CODE>foreach</CODE> no lugar de um laço <CODE>for</CODE> quando
isso for apropriado.
<P>
Mesmo que você possa criar uma lista simplesmente atribuindo uma
variável a uma string de palavras, é melhor usar o comando
<CODE>list</CODE> quando você estiver criando uma lista porque isso
irá assegurar que os itens estarão agrupados da forma que você
espera que eles estejam.
:TEXT_END:

:CODE_START:
set x "a b c"
puts "Item 2 da lista {$x} é: [lindex $x 2]\n"

set y [split 7/4/1776 "/"]
puts "Nós celebramos no [lindex $y 1] dia do [lindex $y 0] mês\n"

set z [list puts "arg 2 é $y" ]
puts "Um comando remontado: $z\n"

set i 0;
foreach j $x {
  puts "$j é o item número $i na lista x"
  incr i;
  }
:TEXT_END: