Tcl/Tk: Expressões aritméticas sem "expr"

O comando [expr] é um dos que mais desagradam quem está começando a programar em Tcl, por causa da sintaxe:

% puts "2 + 2 = [ expr {2+2} ]"
2 + 2 = 4

O comando [unknown], super versátil, permite-nos chutar o [expr] pra escanteio na grande maioria das situações. Normalmente, [unknown] é o comando acionado automaticamente pela linguagem em caso de erro de digitação ou comando desconhecido. Tudo que ele faz é retornar uma mensagem de erro. Exemplo:

% 6*8+3*2+42
invalid command name "6*8+3*2+42"

Mas ele pode ser alterado, como quase tudo em Tcl.

Antes, é mais prudente reservar o comando [unknown] original dando-lhe outro nome:

% rename unknown MsgErro

Agora, ele se chama [MsgErro]. Em seguida, criamos um novo comando [unknown]:

% proc  unknown  args  {
if      { [ regexp  {^[-+/\*\.0-9 ()]+$}  $args ] }     {
return  [ expr $args ]
}

uplevel 1 MsgErro $args
}

Traduzindo: a cláusula “IF” usa Expressões Regulares para detectar se a linha de comando “incorreta” é uma expressão aritmética, inclusive parênteses. Assim, também podemos agrupar expressões. Se a cláusula “IF” não casar, o novo comando [unknown] retorna aquela função de erro original que foi transferida para o comando [MsgErro]. Não precisamos mais da sintaxe chata do [expr]:

% 6*8+3*2+42
96

% 45+2*3+6-1
56

% (45+2)*(3+6)-1
422

% puts "Um dia tem 24 horas ou [24*60] minutos"
Um dia tem 24 horas ou 1440 minutos
This entry was posted in Tcl-Tk and tagged , , , , , . Bookmark the permalink.