:TITLE: Adicionando e Excluindo membros de uma lista
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl15.lsn,v 1.6 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: 03/01/2006
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
Os comandos para adicionar e excluir membros da lista são:
<DL>
<B><DT>concat</B> <I>?arg1 arg2 ... argn?</I>
<DD> Concatena os <I>args</I> em uma única lista. Também elimina
espaços em branco (espaços, tabulações, caracteres de nova linha) 
antes e depois dos args e adiciona um único separado de
espaço entre os args.
<I>Args</I> para <CODE>concat</CODE> podem ser ou elementos individuais,
ou listas. Se um <I>arg</I> já estiver na lista, o conteúdo daquela lista
é concatenado com os outros <I>args</I>.
<P>
Os <I>args</I> para <CODE>concat</CODE> podem ser ou elementos individuais,
ou listas. Se um <I>arg</I> já estiver na lista, o conteúdo daquela 
lista é concatenado com outro <I>arg</I>.
<B><DT>lappend</B> <I>nomeLista?arg1 arg2 ... argn?</I>
<DD> Adiciona os <I>args</I> à lista <I>nomeLista</I> tratando cada
<I>arg</I> como um elemento da lista.
<B><DT>linsert</B> <I>nomeLista índice arg1 ?arg2 ... argn? </I>
<DD> Retorna uma nova lista com os novos elementos da lista inseridos
imediatamente antes do elemento indicado pelo <I>índice</I> em
<I>nomeLista</I>. Cada elemento
dos argumentos se tornará um elemento separado da nova lista. Se índice for
menor ou igual a zero, então os novos elementos são inseridos no início da
lista. Se o índice tem o valor <B>end</B>, ou se for maior ou igual ao número de
elementos na lista, então os novos elementos são adicionados no final da lista.
<B><DT>lreplace</B> <I>nomeLista primeiro último ?arg1 ... argn?</I>
<DD>Retorna uma nova lista com N elementos de <I>nomeLista</I> substituídos
pelos <I>args</I>.
Se <I>primeiro</I> for menor ou igual a 0, lreplace inicia substituindo do 
primeiro elemento da lista. Se <I>primeiro</I> for maior que o fim da lista,
ou for a palavra <B>end</B>, então lreplace se comporta como lappend. Se
houver menos <I>args</I> que o número de posições entre <I>primeiro</I> e
<I>último</I>, então as posições para as quais não há <I>args</I> são
excluídas.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
Os comandos para adicionar e excluir membros da lista são:
<DL>
<B><DT>concat</B> <I>?arg1 arg2 ... argn?</I>
<DD> Concatena os <I>args</I> em uma única lista. Também elimina
espaços em branco (espaços, tabulações, caracteres de nova linha) 
antes e depois dos args e adiciona um único separado de
espaço entre os args.
<I>Args</I> para <CODE>concat</CODE> podem ser ou elementos individuais,
ou listas. Se um <I>arg</I> já estiver na lista, o conteúdo daquela lista
é concatenado com os outros <I>args</I>.
<B><DT>lappend</B> <I>nomeLista ?arg1 arg2 ... argn?</I>
<DD>Adiciona os <I>args</I> à lista <I>nomeLista</I> tratando cada
<I>arg</I> como um elemento da lista.
<B><DT>linsert</B> <I>nomeLista indice arg1 ?arg2 ... argn? </I>
<DD> Retorna uma nova lista com os novos elementos da lista inseridos
imediatamente antes do elemento indicado pelo <I>índice</I> em
<I>nomeLista</I>. Cada elemento
dos argumentos se tornará um elemento separado da nova lista. Se índice for
menor ou igual a zero, então os novos elementos são inseridos no início da
lista. Se o índice tem o valor <B>end</B>, ou se for maior ou igual ao número de
elementos na lista, então os novos elementos são adicionados no final da lista.
<B><DT>lreplace</B> <I>nomeLista primeiro último ?arg1 ... argn?</I>
<DD>Retorna uma nova lista com N elementos de <I>nomeLista</I> substituídos
pelos <I>args</I>.
Se <I>primeiro</I> for menor ou igual a 0, lreplace inicia substituindo do 
primeiro elemento da lista. Se <I>primeiro</I> for maior que o fim da lista,
ou for a palavra <B>end</B>, então lreplace se comporta como lappend. Se
houver menos <I>args</I> que o número de posições entre <I>primeiro</I> e
<I>último</I>, então as posições para as quais não há <I>args</I> são
excluídas.
</DL>
<P>
Dê uma olhada no código do exemplo, e preste atenção especial à
forma que conjuntos de caracteres são agrupados em elementos únicos
de lista.
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
A lista deveria ser útil mesmo se as ações que você pudesse realizar nela
fossem apenas criar e acessar membros. Todavia, há também um conjunto de funções
que permitem a você adicionar e excluir itens de uma lista.
<P>
Esses comandos são:
<DL>
<B><DT>concat</B> <I>?arg1 arg2 ... argn?</I>
<DD> Concatena os <I>args</I> em uma única lista. Também elimina
espaços em branco (espaços, tabulações, caracteres de nova linha) 
antes e depois dos args e adiciona um único separado de
espaço entre os args.
<I>Args</I> para <CODE>concat</CODE> podem ser ou elementos individuais,
ou listas. Se um <I>arg</I> já estiver na lista, o conteúdo daquela lista
é concatenado com os outros <I>args</I>.
<B><DT>lappend</B> <I>nomeLista ?arg1 arg2 ... argn?</I>
<DD>Adiciona os <I>args</I> à lista <I>nomeLista</I> tratando cada
<I>arg</I> como um elemento da lista.
<B><DT>linsert</B> <I>nomeLista indice arg1 ?arg2 ... argn? </I>
<DD> Retorna uma nova lista com os novos elementos da lista inseridos
imediatamente antes do elemento indicado pelo <I>índice</I> em
<I>nomeLista</I>. Cada elemento
dos argumentos se tornará um elemento separado da nova lista. Se índice for
menor ou igual a zero, então os novos elementos são inseridos no início da
lista. Se o índice tem o valor <B>end</B>, ou se for maior ou igual ao número de
elementos na lista, então os novos elementos são adicionados no final da lista.
<B><DT>lreplace</B> <I>nomeLista primeiro último ?arg1 ... argn?</I>
<DD>Retorna uma nova lista com N elementos de <I>nomeLista</I> substituídos
pelos <I>args</I>.
Se <I>primeiro</I> for menor ou igual a 0, lreplace inicia substituindo do 
primeiro elemento da lista. Se <I>primeiro</I> for maior que o fim da lista,
ou for a palavra <B>end</B>, então lreplace se comporta como lappend. Se
houver menos <I>args</I> que o número de posições entre <I>primeiro</I> e
<I>último</I>, então as posições para as quais não há <I>args</I> são
excluídas.
</DL>
<P>Você pode usar essa característica para excluir itens de uma lista 
fornecendo os índices do intervalo dos itens que você deseja excluir, 
e *não* fornecer <I>args</I>.
</DL>
<P>
Execute o exemplo, e o examine enquanto você lê o restante dessa lição.
<P>
Examine a forma que os itens da lista são agrupados no código do exemplo. O
<CODE>{c d e}</CODE> no primeiro exemplo é uma lista de três elementos
consistindo de três letras, enquanto <CODE> {f {g h}}</CODE> é uma lista
de dois elementos consistindo de uma letra e uma lista de duas letras.
Quando esses elementos são juntados em uma única lista com o comando
<CODE>list</CODE>, cada lista dentro da string se torna um elemento
individual da lista. 
<P>
Quando a string é convertida para uma lista com o comando <CODE>split</CODE>, 
a string é separada no espaço em branco (que pode ser um espaço, tabulação,
caracter de nova linha), mas trata as chaves como
caracteres significantes. De maneira a evitar que outros comandos de lista
tentem interpretar as chaves como operadores de agrupamento, elas são
precedidas por barra invertida. Tente usar chaves como os 
<I>caracteresSplit</I>, e veja quais listas foram criadas então.
<P>
Finalmente, quando as listas são agrupadas com <CODE>concat</CODE>, 
a lista de elementos das listas são concatenadas em uma única lista.
:TEXT_END:

:CODE_START:
set b [list a b {c d e} {f {g h}}]
puts "Tratado como uma lista: $b\n"

set b [split "a b {c d e} {f {g h}}"]
puts "Transformado pelo split: $b\n"

set a [concat a b {c d e} {f {g h}}]
puts "Concatenado: $a\n"

lappend a {ij K lm}			;# Note: {ij K lm} is a single element
puts "Depois de 'lappend': $a\n"

set b [linsert $a 3 "1 2 3"]		;# "1 2 3" is a single element
puts "Depois de 'linsert' na posição 3: $b\n"

;# "AA" e "BB" são dois elementos da lista.
set b [lreplace $b 3 5 "AA" "BB"]  
puts "Depois de 'lreplace' 3 posições com 2 valores na posição 3: $b\n"
:TEXT_END:

