:TITLE: Estado do interpretador - info
;#
;# RCSID: $Header: /home/cvs/TclTutor3/lesson/Tcl_Portuguese/Tcl_Portuguese28.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:
Há numerosos subcomandos que fornecem informação sobre o estado atual do
interpretador. Esses comandos fornecem acesso a informações como
a versão atual e nível de <I>patch</I>, qual script está sendo executado
no momento, quantos comandos foram executados, ou quão distante na árvore
de chamadas o proc atual está executando.
<P>
Note que o comando <B>pid</B> não é parte do comando <B>info</B>, mas um comando
por si só.
<P>
<B> Comandos que retornam informação sobre o estado atual do interpretador</B>
<DL>
<B><DT>info cmdcount</B>
<DD>Retorna o número total de comandos que foram executados por esse interpretador.
<B><DT>info level</B> <I>?número?</I>
<DD>Retorna o nível da pilha no qual o compilador está atualmente avaliando o
código. 0 é o nível de topo, 1 é um proc chamado do topo, 2 é um proc
chamado de um proc, etc.
<P>
Se <I>número</I> é um valor positivo, <B>info level</B> retorna o nome
e argumentos do proc naquele nível na pilha. <I>Número</I> é aquele mesmo
valor que <B>file level</B> retornaria se fosse chamado no proc sendo
referenciado.
<P>
Se <I>número</I> é um valor negativo, ele se refere ao nível atual mais o 
<I>número</I>. Portanto, <B>info level</B> retorna o nome e
argumentos do proc naquele nível na pilha.
<B><DT>info patchlevel</B>
<DD>Retorna o valor da variável global <I>tcl_patchlevel</I>. Esse é
o nível de revisão deste interpretador.
<B><DT>info script</B>
<DD>Retorna o nome do arquivo que está sendo avaliado no momento, se
um estiver sendo avaliado. Se não, retorna uma string vazia.
<B><DT>info tclversion</B>
<DD>Retorna o valor da variável global <I>tcl_version</I>. Essa é a
versão do interpretador.
<B><DT>pid</B>
<DD>Retorna o número de <I>pid</I> ('P'rocess 'Id'entification - Identificação de Processo)
do interpretador Tcl atual.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
Há numerosos subcomandos que fornecem informação sobre o estado atual do
interpretador. Esses comandos fornecem acesso a informações como
a versão atual e nível de <I>patch</I>, qual script está sendo executado
no momento, quantos comandos foram executados, ou quão distante na árvore
de chamadas o proc atual está executando.
<P>
Os subcomandos <B>info version</B> e <B>info patchlevel</B> podem ser usados
para descobrir se o nível de revisão do interpretador executando seu código
tem o suporte para as características que você está usando. Se você conhece
certas características que não estão disponíveis em certas revisões do interpretador,
você pode definir seus próprios procs para manipular isso, ou apenas
terminar o programa com uma mensagem de erro.
<P>
Os subcomandos <B>info cmdcount</B> e <B>info level</B> podem ser usados
enquanto se otimiza um script Tcl para descobrir quantos níveis e comandos
foram necessários para completar uma função.
<P>
Note que o comando <B>pid</B> não é parte do comando <B>info</B>, mas um comando
por si só.
<P>
<B> Comandos que retornam informação sobre o estado atual do interpretador</B>
<DL>
<B><DT>info cmdcount</B>
<DD>Retorna o número total de comandos que foram executados por esse interpretador.
<B><DT>info level</B> <I>?número?</I>
<DD>Retorna o nível da pilha no qual o compilador está atualmente avaliando o
código. 0 é o nível de topo, 1 é um proc chamado do topo, 2 é um proc
chamado de um proc, etc.
<P>
Se <I>número</I> é um valor positivo, <B>info level</B> retorna o nome
e argumentos do proc naquele nível na pilha. <I>Número</I> é aquele mesmo
valor que <B>file level</B> retornaria se fosse chamado no proc sendo
referenciado.
<P>
Se <I>número</I> é um valor negativo, ele se refere ao nível atual mais o 
<I>número</I>. Portanto, <B>info level</B> retorna o nome e
argumentos do proc naquele nível na pilha.
<B><DT>info patchlevel</B>
<DD>Retorna o valor da variável global <I>tcl_patchlevel</I>. Esse é
o nível de revisão deste interpretador.
<B><DT>info script</B>
<DD>Retorna o nome do arquivo que está sendo avaliado no momento, se
um estiver sendo avaliado. Se não, retorna uma string vazia.
<B><DT>info tclversion</B>
<DD>Retorna o valor da variável global <I>tcl_version</I>. Essa é a
versão do interpretador.
<B><DT>pid</B>
<DD>Retorna o número de <I>pid</I> ('P'rocess 'Id'entification - Identificação de Processo)
do interpretador Tcl atual.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
O comando <B>info</B> também inclui muitos subcomandos que fornecem
informação sobre o estado do interpretador. Esses comandos fornecem 
acesso a informações como a versão atual e nível de <I>patch</I>, 
qual script está sendo executado
no momento, quantos comandos foram executados, ou quão distante na árvore
de chamadas o proc atual está executando.
<P>
Os subcomandos <B>info version</B> e <B>info patchlevel</B> podem ser usados
para descobrir se o nível de revisão do interpretador executando seu código
tem o suporta para as características que você está usando. Se você conhece
certas características que não estão disponíveis em certas revisões do interpretador,
você pode definir seus próprios procs para manipular isso, ou apenas
terminar o programa com um mensagem de erro.
<P>
Os subcomandos <B>info cmdcount</B> e <B>info level</B> podem ser usados
enquanto se otimiza um script Tcl para descobrir quantos níveis e comandos
foram necessários para completar uma função.
<P>
Execute o exemplo, e examine a saída enquanto você lê esta descrição
do exemplo de código.
<P>
As primeiras duas linhas mostram quantas instruções foram executadas.
A saída inicial é grande porque todos os comandos que o interpretador
executa atribuem a si mesmos para executar o script. Note que o número
de comandos aumenta em dois nas duas linhas. Há dois comandos na primeira
linha, o <B>puts</B>, e o <B>[info cmdcount]</B>.
<P>
As chamadas <B>patchlevel</B> e <B>tclversion</B> irão retornar o mesmo
valor se não houver revisões aplicadas à versão do interpretador que
está executando. Se revisões foram aplicadas, então o subcomando
<B>patchlevel</B> irá retornar uma string que inclui revisões, enquanto
que <B>tclversion</B> irá retornar o nível de versão base.
<P>
O comando <B>info script</B> irá retornar o nome do script que está
sendo executado. Quando você clica no botão <B>Executar exemplo</B>, 
o programa TclTutor escreve o código na janela <B>Exemplo de código</B> 
para um arquivo no dirétorio temporário, e executa dele aquele script.
<P>
Quando programas são chamados no sistema operacional Unix, um número
é atribuído a eles. Esse número é o número de Identificação do Processo,
ou PID, para abreviar. Quando você precisa interagir com um processo
no nível mais baixo do sistema operacional, o processo é referenciado
por esse número. Esse número também é único. Dois processos não podem
ter o mesmo PID no sistema, ao mesmo tempo.
<P>
Portanto, o PID pode ser usado para gerar um nome de arquivo único. O
nome de arquivo descrito no script é gerado com uma linha de código
como essa:
<P>
<PRE><CODE>set nomeArquivo "/tmp/xmpl.[pid].tcl"
</CODE></PRE>
O comando <B>pid</B> é mostrado nesse exemplo de código e exibe o
PID do script. Cada vez que você clica no botão <B>Executar exemplo</B>
ele irá mostrar um número diferente, caso exista outro processo que
adquiriu o número anteriormente exibido.
<P>
O proc <B>fatorial</B> demonstra uma forma de usar o comando <B>info level</B>
para escrever um programa fatorial ineficiente. O proc <B>fatorial</B>
irá continuar chamando a si mesmo até o nível atual alcançar o valor
que foi passado como argumento. Quando esse nível for alcançado, as
chamadas anteriores a <B>fatorial</B> irão retornar cada chamada com
o valor da chamada anterior ao proc <B>fatorial</B>. Isso será feito
<CODE>($valor-$nivel)</CODE> vezes.
<P>
Quando uma função chama a si mesma, isso é chamado de recursão.
<P>
Quando <B>fatorial</B> é chamado na primeira vez, o nível é 1. Como
<CODE>$nivel</CODE> não é igual ao <CODE>$valor</CODE>, a linha
depois da declaração if é executada. O interpretador Tcl vê que o 
retorno declarado requer o retorno de uma chamada a <B>fatorial</B>,
e ele invoca o proc <B>fatorial</B> novamente.
<P>
Neste momento, <B>$nivel</B> é 2. Novamente, a declaração if é falsa, e
o <B>fatorial</B> é chamado novamente.
<P>
Desta vez, como um proc chamou um proc que chamou um proc, o nível é 3.
No exemplo de código, <CODE>$nivel = $valor</CODE>, então a função
retorna o valor de <CODE>$valor</CODE>.
<P>
Aquele valor é lido na última linha da chamada anterior de <B>fatorial</B>,
quando o <CODE>$nivel</CODE> era 2.  <CODE>($valor-$nivel)</CODE> = 3-2, = 1.
Então, a última linha se torna <CODE> 1*3</CODE>, e essa chamada de <B>fatorial</B>
retorna 3 para a chamada anterior (primeira) de <B>fatorial</B>.
<P>
Na primeira chamada de <B>fatorial</B>, o nível era 1. <CODE>3-1=2</CODE>,
então a última linha retorna <CODE>2*3</CODE>, que é 6.
<P>
É óbvio que multiplicar um número por 1 é um passo desnecessário. Tente
modificar o exemplo de código para reduzir o número de recursões e ver
quantos comandos a menos você pode reduzir para calcular o fatorial.
<P>
<B> Comandos que retornam informação sobre o estado atual do interpretador</B>
<DL>
<B><DT>info cmdcount</B>
<DD>Retorna o número total de comandos que foram executados por esse interpretador.
<B><DT>info level</B> <I>?número?</I>
<DD>Retorna o nível da pilha no qual o compilador está atualmente avaliando o
código. 0 é o nível de topo, 1 é um proc chamado do topo, 2 é um proc
chamado de um proc, etc.
<P>
Se <I>número</I> é um valor positivo, <B>info level</B> retorna o nome
e argumentos do proc naquele nível na pilha. <I>Número</I> é aquele mesmo
valor que <B>file level</B> retornaria se fosse chamado no proc sendo
referenciado.
<P>
Se <I>número</I> é um valor negativo, ele se refere ao nível atual mais o 
<I>número</I>. Portanto, <B>info level</B> retorna o nome e
argumentos do proc naquele nível na pilha.
<B><DT>info patchlevel</B>
<DD>Retorna o valor da variável global <I>tcl_patchlevel</I>. Esse é
o nível de revisão deste interpretador.
<B><DT>info script</B>
<DD>Retorna o nome do arquivo que está sendo avaliado no momento, se
um estiver sendo avaliado. Se não, retorna uma string vazia.
<B><DT>info tclversion</B>
<DD>Retorna o valor da variável global <I>tcl_version</I>. Essa é a
versão do interpretador.
<B><DT>pid</B>
<DD>Retorna o número de <I>pid</I> ('P'rocess 'Id'entification - Identificação de Processo)
do interpretador Tcl atual.
</DL>
:TEXT_END:

:CODE_START:
puts "Essa é a quantidade de comandos que foram executados: [info cmdcount]"
puts "Agora *ESSA* é a quantidade de comandos que foram executados: [info cmdcount]"

puts "\nEsse interpretador tem a versão: [info tclversion]"
puts "Esse interpretador tem o nível de revisão: [info patchlevel]"

puts "\nO script temporário que está executando é chamado: [info script]"
puts "O PID para esse programa é [pid]"

proc fatorial {valor} {
  puts "Nível atual: [info level] - valor: $valor"
  set nivel [info level]
  if {$nivel == $valor} {return $valor}
  return [expr ($valor-$nivel) * [fatorial $valor]];
  }

set cont1 [info cmdcount]
set fat [fatorial 3]
set cont2 [info cmdcount]
puts "O fatorial de 3 é $fat"
puts "Antes de chamar o proc fatorial, $cont1 comandos foram executados"
puts "Depois de chamar o proc fatorial, $cont2 comandos foram executados"
puts "Eu utilizei [expr $cont2-$cont1] comandos para calcular esse fatorial"

:TEXT_END: