:TITLE: Aprendendo sobre a existência de comandos e variáveis - info
;#
;# RCSID: $Header: /home/cvs/TclTutor3/lesson/Tcl_Portuguese/Tcl_Portuguese27.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: 12/01/2006
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
O comando <B>info</B> permite a um programa Tcl obter informação do
interpretador Tcl sobre o estado atual do interpretador. As próximas
três lições cobrem aspectos do comando <B>info</B>.
<P>
Esta lição cobre os subcomandos <B>info</B> que retornam informação sobre
quais procs, variáveis, ou comandos estão atualmente existentes nesta
instância do interpretador. Utilizando esses subcomandos você pode determinar
se uma variável ou proc existe antes de tentar acessá-lo.
<P>
<B> Comandos info que retornam listas de comandos visíveis e variáveis.</B>
<DL>
<B><DT>info commands</B> <I>?modelo?</I>
<DD>Retorna uma lista de comandos compatíveis com o <I>modelo</I>, utilizando
as regras de <B>string match</B>. Se <I>modelo</I> não é fornecido, uma lista
de todos os comandos é retornada.
<B><DT>info exists</B> <I>nomeVar</I>
<DD>Retorna 1 se <I>nomeVar</I> existe como uma variável no contexto atual,
caso contrário retorna 0.
<B><DT>info globals</B> <I>?modelo?</I>
<DD>Retorna uma lista de variáveis globais que são compatíveis com o <I>modelo</I>, 
utilizando as regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido,
uma lista de todas as variáveis globais é retornada.
<B><DT>info locals</B> <I>?modelo?</I>
<DD>Retorna uma lista de variáveis locais que são compatíveis com o <I>modelo</I>, 
utilizando as regras de <B>string match</B>. Se o <I>modelo</I> não for fornecido, 
uma lista de todas as variáveis locais é retornada.
<B><DT>info procs</B> <I>?modelo?</I>
<DD>Retorna uma lista de procs que são compatíveis com o <I>modelo</I>, utilizando as
regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido, uma lista de
todos os procs é retornada.
<B><DT>info vars</B> <I>?modelo?</I>
<DD>Retorna uma lista das variáveis compatíveis com o <I>modelo</I>, utilizando as
regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido, uma lista de
todas as variáveis é retornada.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
O comando <B>info</B> permite a um programa Tcl obter informação do
interpretador Tcl sobre o estado atual do interpretador. As próximas
três lições cobrem aspectos do comandos <B>info</B>.
<P>
Esta lição cobre os subcomandos <B>info</B> que retornam informação sobre
quais procs, variáveis, ou comandos estão atualmente existentes nesta
instância do interpretador. Utilizando esses subcomandos você pode determinar
se uma variável ou proc existe antes de tentar acessá-lo.
<P>
O código do exemplo mostra como utilizar o comando <B>info exists</B> para
criar um incremento que nunca retornará um erro de <B>variável não encontrada</B>,
uma vez que ele checa para estar certo que a variável existe antes de 
incrementá-la.
<P>
<B> Comandos info que retornam listas de comandos visíveis e variáveis.</B>
<DL>
<B><DT>info commands</B> <I>?modelo?</I>
<DD>Retorna uma lista de comandos compatíveis com o <I>modelo</I>, utilizando
as regras de <B>string match</B>. Se <I>modelo</I> não é fornecido, uma lista
de todos os comandos é retornada.
<B><DT>info exists</B> <I>nomeVar</I>
<DD>Retorna 1 se <I>nomeVar</I> existe como uma variável no contexto atual,
caso contrário retorna 0.
<B><DT>info globals</B> <I>?modelo?</I>
<DD>Retorna uma lista de variáveis globais que são compatíveis com o <I>modelo</I>, 
utilizando as regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido,
uma lista de todas as variáveis globais é retornada.
<B><DT>info locals</B> <I>?modelo?</I>
<DD>Retorna uma lista de variáveis locais que são compatíveis com o <I>modelo</I>, 
utilizando as regras de <B>string match</B>. Se o <I>modelo</I> não for fornecido, 
uma lista de todas as variáveis locais é retornada.
<B><DT>info procs</B> <I>?modelo?</I>
<DD>Retorna uma lista de procs que são compatíveis com o <I>modelo</I>, utilizando as
regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido, uma lista de
todos os procs é retornada.
<B><DT>info vars</B> <I>?modelo?</I>
<DD>Retorna uma lista das variáveis compatíveis com o <I>modelo</I>, utilizando as
regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido, uma lista de
todas as variáveis é retornada.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
O interpretador Tcl tem muitas tabelas de informação que mantém marcas de
seu estado enquanto o interpretador está executando. Essas tabelas incluem
listas de todos os procs e comandos que foram definidos, listas de variáveis
globais, e listas de variáveis que são visíveis para o proc atual.
<P>
Esta lição cobre os subcomandos <B>info</B> que retornam essas listas de
quais procs, comandos e variáveis estão disponíveis. Utilizando esses
subcomandos você pode determinar se uma variável ou proc existe antes
de tentar acessá-la.
<P>
Por exemplo, considere o que aconteceria se você tentasse incrementar uma
variável que não tivesse sido definida ainda. Isso pode acontecer facilmente
se você utiliza vetores associativos para construir um histograma de
dados estatísticos, por exemplo.
<P>
O código do exemplo mostra como utilizar o comando <B>info exists</B> para
criar um incremento que nunca retornará um erro de <B>variável não encontrada</B>,
uma vez que ele checa para estar certo que a variável existe antes de 
incrementá-la.
<P>
Execute o exemplo, e veja a saída enquanto você lê esta descrição do código.
<P>
O primeiro proc é o <B>incrSeguro</B>. Ele toma dois argumentos, o segundo
tem o valor padrão 1. O primeiro argumento é o nome de uma variável que
pode existir na chamada do programa. Existem os mesmos argumentos
que você usaria se chamasse o comando <B>incr</B> normal.
<P>
Depois de usar o comando <B>upvar</B> para unir o escopo local da variável ao
nível acima, <B>info exists</B> é chamado para determinar se a variável existe.
Se ela existe, então <B>incr</B> é chamado. Se <B>info exists</B> retorna falso,
então a variável é inicializada com o valor do incremento.
<P>
A próxima linha mostra como você pode usar o comando <B>info procs</B> para
descobrir se um proc existe antes de você chamá-lo. <B>Info procs</B> irá
retornar uma lista de procs que encontram uma string, ou uma lista de
todos os procs, se não houver um segundo argumento.
<P>
Depois disso estão muitas linhas que demonstram o proc <B>incrSeguro</B> 
funcionando.
<P>
Depois, <B>info vars</B> e <B>info globals</B> são usados para listar
todas as variáveis que estão disponíveis no escopo atual. Essas listas
são idênticas porque todas as variáveis no nível de topo são globais.
<P>
Depois, <B>info procs</B> é usado para testar um proc que não foi definido ainda.
<P>
<B>procLocal</B> mostra as diferenças em variáveis que são definidas dentro
de um procedimento. Apenas <B>loc1</B> e <B>loc2</B> são locais ao proc,
enquanto que <B>argv</B> está disponível porque está declarada como uma
variável global.
<P>
Se <B>argv</B> não fosse declarada global, mas fosse apenas usada nesta
função, uma variável local <B>argv</B> seria criada para uso dentro desse
proc. Esta variável local <B>argv</B> não teria o valor que aquela variável
global <B>argv</B> tinha, e quaisquer modificações feitas em <B>argv</B> 
seriam perdidas quando este processo fosse retornado.
<P>
Depois que <B>procLocal</B> é definido, <B>info procs</B> é usado novamente 
para mostrar que o proc agora existe.
<P>
Finalmente, <B>procLocal</B> é chamado, e as variáveis visíveis dentro do
proc são mostradas.
<P>
<B> Comandos info que retornam listas de comandos visíveis e variáveis.</B>
<DL>
<B><DT>info commands</B> <I>?modelo?</I>
<DD>Retorna uma lista de comandos compatíveis com o <I>modelo</I>, utilizando
as regras de <B>string match</B>. Se <I>modelo</I> não é fornecido, uma lista
de todos os comandos é retornada.
<B><DT>info exists</B> <I>nomeVar</I>
<DD>Retorna 1 se <I>nomeVar</I> existe como uma variável no contexto atual,
caso contrário retorna 0.
<B><DT>info globals</B> <I>?modelo?</I>
<DD>Retorna uma lista de variáveis globais que são compatíveis com o <I>modelo</I>, 
utilizando as regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido,
uma lista de todas as variáveis globais é retornada.
<B><DT>info locals</B> <I>?modelo?</I>
<DD>Retorna uma lista de variáveis locais que são compatíveis com o <I>modelo</I>, 
utilizando as regras de <B>string match</B>. Se o <I>modelo</I> não for fornecido, 
uma lista de todas as variáveis locais é retornada.
<B><DT>info procs</B> <I>?modelo?</I>
<DD>Retorna uma lista de procs que são compatíveis com o <I>modelo</I>, utilizando as
regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido, uma lista de
todos os procs é retornada.
<B><DT>info vars</B> <I>?modelo?</I>
<DD>Retorna uma lista das variáveis compatíveis com o <I>modelo</I>, utilizando as
regras de <B>string match</B>. Se o <I>modelo</I> não é fornecido, uma lista de
todas as variáveis é retornada.
</DL>
:TEXT_END:

:CODE_START:
;#
;# incrSeguro checa a existência de variáveis antes
;# de tentar incrementá-las. Se a variável não existe,
;# ela é inicializada e retornada.

proc incrSeguro { val {amt 1} } {
  upvar $val v
  if {[info exists v]} { incr v $amt}  else { set v $amt }
}


;#
;# Checa se o proc incrSeguro existe antes de chamá-lo

if {[info procs incrSeguro] == "incrSeguro"} {
  incrSeguro a
  }

puts "Depois de chamar incrSeguro com uma variável não existente: $a"

set a 100
incrSeguro a
puts "Depois de chamar incrSeguro com uma variável com um valor de 100: $a"

incrSeguro b -3
puts "Depois de chamar incrSeguro com uma variável não existente e -3: $b"

set b 100
incrSeguro b -3
puts "Depois de chamar incrSeguro com uma variável cujo valor é 100 e -3: $b"

puts "\nEssas variáveis foram definidas: [lsort [info vars]]"
puts "\nEssas variáveis globais foram definidas: [lsort [info globals]]"

;#
;# Checa pela existência de procLocal
;#

set exist [info procs procLocal]
if {$exist == ""} {
  puts "\nprocLocal não existe no ponto 1"
  }

proc procLocal {} {
  global argv

  set loc1 1
  set loc2 2
  puts "\nVariáveis locais acessíveis nesse proc são: [lsort [info locals]]"
  puts "\nVariáveis acessíveis desse proc são: [lsort [info vars]]"
  puts "\nVariáveis globais visíveis desse proc são: [lsort [info globals]]"
  }

set exist [info procs procLocal]
if {$exist != ""} {
  puts "procLocal existe no ponto 2"
  }

procLocal
:TEXT_END:

