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