sexta-feira, 23 de abril de 2010

Velhas ferramentas

Algumas velhas ferramentas continuam úteis mesmo depois da aparição de modernidades muito mais sofisticadas. A linguagem Tcl/Tk surgiu um 1988 e tive o primeiro contato com ela por volta de 1996.

Ela é uma linguagem muito simples, projetada para facilitar a vida de quem quer montar uma interface gráfica para um programa ou oferecer uma linguagem de programação simples para um sistema.

Existem alternativas muito mais sofisticadas, como Perl ou Python, mas o Tcl/Tk tem uma grande vantagem: além de ser portável, é muito simples gerar um executável para Windows. Ela está sempre presente em todas as plataformas *nix. Eu já vi um Unix sem um compilador C, mas nunca vi um sem Tcl/Tk.

Em Tcl/Tk, tudo é um comando seguido de parâmetros separados por espaços.

comando parm1 parm2 parm3...

Até mesmo as estruturas de controle são comandos. O if é um comando cujo primeiro parâmetro é uma condição, o segundo uma ação a executar se a condição for verdadeira, etc. É fácil escrever um comando em C e adicioná-lo ao ambiente.

Pois, há pouco precisei de um find com expressão regular no Windows, como no Linux. Eu podia ter procurado o find do GNU, mas resolvi brincar um pouco com o Tcl.

O resultado foi muito mais simples do que eu esperava:

if {$argc<2} {
puts "Usage: find dir regexp";
exit
}

set dir [lindex $argv 0]
set re [lindex $argv 1]

proc find {filename re} {
set total 0
if {[regexp $re $filename]>0} {
puts $filename
incr total
}
if {[file isdirectory $filename]>0} {
set files [glob "$filename/*"]
foreach f $files {
catch { incr total [find $f $re] }
}
}
return $total
}
puts "[find $dir $re] files"

Esse pequeno programa recebe dois parâmetros: um diretório e uma expressão regular. Ele percorre os diretórios recursivamente (a partir do indicado) e vai imprimindo na tela os nomes dos arquivos que são reconhecidos pela expressão regular. No fim, ele ainda diz quantos arquivos foram encontrados. Por exemplo:

find C:\Windows\ .*dll

Testei-o no Linux e ele funcionou sem nenhuma modificação, coisa que seria difícil, mesmo para o Java. O executável tem cerca de 1,5MB. É um pouco grande, mas a maior parte se deve ao interpretador, que é empacotado junto com o programa. Portanto, programas maiores não devem crescer muito de tamanho. De qualquer forma, é muito mais prático que forçar o usuário a instalar o Java Runtime (uns 15MB) ou o Perl (uns 5MB).

3 comentários:

Marcus Aurelius disse...

O código está muito pequeno pra ler. Tive que dar zoom na página pra ler. Dá pra aumentar?

forinti disse...

Pronto. Tive que aumentar tudo um pouco, para não perder partes das linhas de código mais compridas. Coloquei uma cor no fundo, para destacar o código do texto.

Marcus Aurelius disse...

Valeu!