2006-10-25

Tcl/Tk

tcl.jpg Faz mais de um mês que não escrevo nada sobre Informática! Como já faz tempo que quero escrever sobre Tcl/Tk, vamos lá!

Tcl (Tool Command Language) é uma linguagem de script de código aberto muito poderosa. Desenvolvido por John Ousterhout, é costume dizer que é uma linguagem fácil, mas discordo.

É baseada em comandos (há uma variante orientada a objetos, chamada [incr Tcl]) com uma proposta interessante: tudo são strings!

Uma string em Tcl não precisa de delimitador, a menos que possua caracteres não-permitidos, como espaço e mudança de linha. Neste caso, o delimitador padrão é " (ou chaves).

Vamos a alguns exemplos...

Para se alterar ou ler o valor de uma variável usa-se o comando set. No exemplo a seguir, o script lê o valor da variável e retorna o dobro:

puts -nonewline stdout {Informe um número: }
gets stdin num
set num [expr [set num] * 2]
puts stdout "O dobro é [set num]"


O primeiro comando (puts) grava na saída padrão (stdout, a tela) a string «Informe um número: » sem mudar de linha (-nonewline). As chaves ({...}) também delimitam uma string, mas não interpretam colchetes (veja adiante).

Então o comando gets lê da entrada padrão (stdin, o teclado) um valor e atribui à variável num.

No próximo comando, set, usamos colchetes ([...]). Os colchetes interpretam um comando e são substituídos por seu retorno.

Ou seja, se foi atribuído o número 123 à variável num, no comando:
expr [set num] * 2


A parte entre colchetes, set num, retorna o valor de num, portanto 123, então os colchetes serão substituídos, recriando a string do comando assim:
expr 123 * 2


O comando expr avalia uma expressão matemática e retorna seu valor. Então:
set num [expr [set num] * 2]


Calcula o dobro do conteúdo de num e atribui a num.

O último comando grava na saída padrão (exibe na tela, ora pois!) a string «O dobro é [set num]», substituindo os colchetes pelo valor de num.

Repare que no primeiro puts, a string está protegida por chaves, e no segundo por aspas. Sempre dou preferência ao uso de chaves, mas as chaves protegem a string de interpretação, enquanto que aspas permitem a interpretação de colchetes (e cifrão, veja a seguir).

Agora, há um jeito de simplificar este código: seguindo as sintaxes de Shell e de Perl, existe uma forma simplificada de escrever set num com cifrão ($):
puts -nonewline stdout {Informe um número: }
gets stdin num
set num [expr $num * 2]
puts stdout "O dobro é $num"


Estruturas de controle


Dada a introdução, quero agora comentar algumas estruturas de controle de fluxo...

O primeiro comando é if. Sua estrutura é assim: if condição bloco1 [else bloco2]. Aqui, condição, bloco1 e bloco2 são strings (como não poderia deixar de ser). Então:
if {$sair == 1} {
puts stdout Tchau
exit
}


Se o conteúdo da variável sair for igual a um, exibe Tchau e sai. Como em outras linguagens, o bloco do else é executado se a condição for falsa.

A igualdade dupla (==) é usada para comparar valores numéricos. Para a comparação de strings, é usado o comando string com a opção equal:
if [string equal $var1 $var2] {
puts stdout {São iguais!}
} else {
puts stdout {São diferentes!}
}


Se quiser uma comparação ignorando maiúsculas e minúsculas, é só usar string equal -nocase. Repare que aqui a string interpretada pelo if como condição não é o comando em si, mas seu resultado.

Outro comando é o famigerado for.

A estrutura: for inicialização condição passo bloco. Novamente cada termo é uma string.

Vamos a um exemplo simples:
for {set i 0} {$i < 10} {incr i} {puts stdout $i}


Vai exibir todos os número de 0 a 9. Mas o comando é feio e difícil de guardar, né?

Então, existe um variante do Tcl chamado TclX (Tcl estendido), com um comando muito útil: loop.
loop i 0 10 {
echo $i
}


O comando echo de TclX é equivalente a puts stdout de Tcl. Em loop é possível passar mais um argumento entre o máximo e o bloco como passo (tipo: loop i 0 20 2 {...).

Obs.: TclX aceita todos os comandos de Tcl e implementa (estende) mais alguns.

Outros comandos de controle de fluxo interessantes em Tcl são: while, switch e foreach.

Funções


O comando para criar uma função é proc, que recebe como primeira string a lista de argumentos (separados por espaços) e como segunda string o bloco de comandos. Ex.:
proc fib n {
set a 0
set b 1
set c 1
while {$c <= $n} {
set aux $a
set a $b
incr b $aux
incr c
}
return $b
}


Então fib vai calcular a sequência de Fibonacci:

for {set i 0} {$i < 10} {incr i} {
puts stdout [fib $i]
}


Tk


Agora a parte mais interessante: Tk!

Tk é o toolkit gráfico de Tcl. O comando para usar Tcl com Tk é wish (e para usar TclX com Tk é wishx).

Em Tk a janela raiz é representada por um ponto (.).

Vamos criar um olá mundo!!!
#!/bin/sh
#\
exec wish "$0" "$@"

tk appname Ola
tk_setPalette gray

label .lbOla -text {Olá Mundo!!!}
button .btOk -text Ok -command exit

pack .lbOla .btOk


As três primeiras linhas são um cabeçalho pra podermos tornar o script executável.

O primeiro comando (tk appname) define o nome da aplicação (Ola), e o comando seguinte (tk_setPalette) diz pra usar como cores variantes de cinza (gray).

O comando label cria um rótulo (label) chamado lbOla na janela raiz (.) com o texto «Olá Mundo!!!». O comando button cria um botão chamado btOk na janela raiz (.) com o texto «Ok» e que, ao ser clicado (-command), executa exit (sair).

O comando pack indica que será usado o geometry manager pack. Geometry managers são gerenciadores de widgets (objetos gráficos) e geometria. Tk usa três: pack («empacota» em relação a posições esquerda, direita, em cima, em baixo, e tenta manter estas relações), grid (usa uma tabela – grade – colocando os widgets nas células da tabela) e place (desaconselhável: coloca os widgets em posições absolutas).

O gerenciador pack por padrão coloca os widgets a partir de cima (top), um de baixo do outro, centralizando (é possível mudar isso usando -side).

Para colocar os widgets um do lado do outro a partir da esquerda, usa-se -side left, a partir da direita: -side right. Para «amarrar» um widget em baixo, usa-se -side bottom.

O grid prende os widgets centralizados (é configurável) em células. A célula exata é informada através dos números de linha (-row) e coluna (-column). É possível que um widget ocupe mais de uma coluna (-columnspan) ou mais de uma linha (-rowspan).

O script acima poderia ser reescrito usando grid assim:
#!/bin/sh
#\
exec wish "$0" "$@"

tk appname Ola
tk_setPalette gray

label .lbOla -text {Olá Mundo!!!}
button .btOk -text Ok -command exit

grid .lbOla -row 0 -column 0
grid .btOk -row 1 -column 0


Para saber mais


O melhor lugar para se encontra mais informações sobre Tcl/Tk é na secção (n) (new) das manpages, mas um macete indispensável é digitar o seguinte comando no shell de um xterm:
tcl <<< tclhelp


[]'s

PS: Procure screenshots no Google!

2006-10-10

Esperanto - complemento

Estes dois textos abaixo são traduções dos primeiros parágrafos do último artigo respectivamente para o Esperanto e para o Arcaicam Esperantom (em Esperanto: Arĥaika Esperanto, criado por Manuel Halvelik).

São apenas exemplos. =)

--------

Antaŭ iom da tempo mi volas skribi pri la Esperanto.

Kutime traktata per antaŭjuĝo, nekonfideco kaj nesciigo, la Esperanto estas la planlingvo plej parolata kaj plej bone planita el la homa historio. Estis planita de Ludwik Zamenhof je 1887 (mil okcent okdek sep), sed akiris propran vivon tra la jardekoj.

Ĝia lernado estas dekope pli rapide ol la lernado de la angla, kaj eble estas akiri bonecgradon neakireblan en la angla (aŭ alia ajn etna lingvo) de nenata parolanto.

— Kial?

Nur ĉar neniam iu estos pli bona fluparolanto ol nata parolanto. Ĉiam estos parolmaniero – ne signifas, ke ne estas parolmaniero de nata parolanto, sed ĝia estas la «ĝusta parolmaniero»...


--------

Antez iohem da tempo mihi volams scribir pri Esperantom.

Cutime tractatam per antezyughom, necomphidetzom cay nestziagom, Esperantom estat planlingvom pley parolatam cay pley bone planitam el homam historiom. Estit planitam de Ludwik Zamenhof ye 1887 (mil octzent ocdec sep), sed aquirit propran vivon tra la yardecoym.

Eghies lernadom estat decope pli rapide ol lernadom angles, cay eble estat aquirir bonetzgradon neaquireblan en anglam (aw alia ayn etnam lingvom) de nenatam parolantom.

— Cuyal?

Nur char nemyahem iu estot pli bonam phluparolantom ol natam parolantom. Cheyahem estot parolmanierom – ne signiphat, que ne estat parolmanierom de natam parolantom, sed eghies estat «ghustam parolmanierom»...

2006-10-04

Esperanto


Faz tempo que quero escrever alguma coisa sobre o Esperanto.

Geralmente tratado com preconceito, desconfiança e desinformação, o Esperanto é a língua artificial mais falada e mais bem planejada da história humana. Foi idealizado por Ludwik Zamenhof em 1887, mas ganhou vida própria ao logo das décadas.

Seu aprendizado é dez vezes mais rápido do que o do inglês, e é possível atingir um grau de excelência impossível de ser conseguido no inglês (ou qualquer língua natural) por um falante não-nato.

— Por quê?

Simplesmente porque ninguém nunca terá a mesma fluência numa língua que tem um falante nato. Sempre terá algum sotaque – não que o falante nato não tenha sotaque, mas seu sotaque é o «sotaque correto»...

Quando se fala de uma língua artificial, todos os sotaques e regionalismos são «corretos», visto que nenhum é o sotaque nativo.

Uma prova disso é o nascimento do Globish.

Além do mais, o uso de uma língua natural para comunicação internacional resulta necessariamente na supremacia cultural dos países que possuem tal língua como nativa/oficial. Exemplos disso são, além do efeito destrutivo das dominações inglesa na Índia e espanhola na Galiza; situações constrangedoras em reuniões da ONU, como quando um representante de um governo do Leste Europeu disse «my government sinks» («meu governo afunda») em vez de «my government thinks» («meu governo acha», obviamente por uma natural dificuldade com o fonema þ) ou quando houve uma má interpretação do termo «period», que causou o fim de uma audiência séria, terminada em uma mal-educada crise de risos dos representantes dos EUA e da Inglaterra.

Bem, tendo sido explicados os motivos, vamos esclarecer alguns equívocos.

Algumas pessoas dizem que a intenção do Esperanto é substituir as demais línguas do mundo. Isso é ridículo. O Esperanto é uma ferramenta de comunicação internacional e não pretende substituir nenhuma língua nativa, mas sim ser uma segunda língua para todos os povos do mundo.

Na verdade o efeito do Esperanto é justamente o contrário. Historicamente sabemos que o uso de uma língua natural para comunicação internacional resulta na destruição de outras línguas e consequentemente de suas respectivas riquezas culturais. Um bom exemplo é a influência do latim na cultura européia – alguém sabe alguma coisa sobre a língua ibérica pré-latina? Ninguém. Nada sobreviviu, a não ser alguns nomes de localidade que hoje não fazem sentido algum.

Devido a suas características peculiares, o uso do Esperanto como ferramenta de comunicação internacional fomenta a preservação das línguas naturais, preservando assim também a Cultura Humana.

Agora vamos ver um pouco do Esperanto em si.

O Esperanto é sistematicamente regular e possui apenas dezesseis (16) regras gramaticais, a saber:

  1. Não existe artigo indefinido. O artigo definido é la, que é invariável quanto a gênero, caso ou número.

  2. Os substantivos são terminados no nominativo singular por -o; para o plural acrescenta-se -j. Há apenas dois casos: nominativo e acusativo, o acusativo forma-se pelo acréscimo da terminação -n.

  3. Os adjetivos são formados pela terminação -a e devem concordar em número e caso com os substativos. O comparativo de superioridade é formado pelo vocábulo pli, o superlativo por plej. O complemento do comparativo é ol, o do superlativo é el.

  4. Os numerais cardinais são: 0 nulo, 1 unu, 2 du, 3 tri, 4 kvar, 5 kvin, 6 ses, 7 sep, 8 ok e 9 naŭ, 10 dek, 100 cent e 1000 mil. Dezenas e centenas se formam pela junção dos numerais (ex.: 23 dudek tri). O acréscimo da terminação -a forma os numerais ordinais (ex.: 2º dua).

  5. Os pronomes pessoais são mi (eu), vi (tu, originalmente ci), li (ele), ŝi (ela), ĝi (neutro da terceira pessoa), ni (nós), vi (vós), ili (eles) e oni (indefinido). Os pronomes possessivos são a forma adjetiva, ou seja, acrescentando-se a terminação -a.

  6. O verbo não varia quanto a número ou pessoa. Os modos/tempos são: presente -as, passado -is, futuro -os, condicional -us, infinitivo -i, imperativo -u, particípio presente ativo -ant-, particípio passado ativo -int-, particípio futuro ativo -ont-, particípio presente passivo -at-, particípio passado passivo -it-, particípio futuro passivo -ot-. A voz passiva se faz com o verbo esti (ser/estar) e o complemento é de («feito por mim» = «farita de mi»).

  7. Os advérbios são terminados em -e. Os graus comparativos e superlativo são formados da mesma forma que os adjetivos.

  8. Todas as preposições por si pedem o caso nominativo.

  9. Cada letra representa um som e cada som é representado por uma única letra, invariavelmente. Toda palavra é lida como se escreve.

  10. Em toda palavra completa (isto é, sem apóstrofo), a sílaba tônica é a penúltima (paroxítona). Nas palavras apostrofadas, a sílaba tônica é a última (oxítona).

  11. Palavras compostas são formadas por justaposição, sendo a principal a última. Terminações gramaticais são consideradas palavras autônomas.

  12. A negação é simples (não = ne). Havendo outra palavra negativa, retira-se a partícula ne.

  13. Para indicar alvo, direção, usa-se a terminação do acusativo (-n). Ex.: kie = onde, kien = para onde.

  14. Toda preposição tem significado constante e bem definido; quando o significado da preposição não é bem definido, usa-se a preposição je.

  15. Palavras estrangeiras são usadas sem alteração.

  16. A terminação substantiva -o e o -a de la podem ser substituídos por um apóstrofo.


Quem leu todas as regras (ou pelo menos as dez primeiras) deve ter visto que a nona regra diz que para cada letra há um som e para cada som um letra.

São 28 letras no Esperanto, cada uma representando um único e invariável som:

  • A – «a» aberto comum, como em casa;
  • B – como em bola;
  • C – como o «t» do latim clássico antes de «i», é um «ts» bem fundido (X-SAMPA: /ts)/);
  • Ĉ – como em tchau;
  • D – como em dado;
  • E – «e» fechado, como na própria palavra fechado;
  • F – como em faca;
  • G – como em gato;
  • Ĝ – como no inglês jet;
  • H – como no inglês hat;
  • Ĥ – exatamente a letra tcheca, ou seja velar uvular fricativo (X-SAMPA: /kR)/);
  • I – «i» vocálico, como em indígena, nunca como em meio;
  • J – semivogal «i», como em meio (é uma consoante);
  • Ĵ – como em jato ou geléia;
  • K – como em carro;
  • L – como em lua;
  • M – como em meio;
  • N – como em nada;
  • O – «o» fechado, como em outro;
  • P – como em pato;
  • R – como em raro;
  • S – como em sapo;
  • Ŝ – como em chato;
  • T – como em tatu;
  • U – «u» vocálico, como em último, nunca como em meu;
  • Ŭ – semivogal «u», como em meu (é uma consoante);
  • V – como em vovó;
  • Z – como em casa.


Não existem vogais nasalizadas, nem «é» e «ó» (abertos). Também não fazem parte do alfabeto as letras q, w, x e y.

Bem, depois disso tudo, seria legal mostrar alguns exemplos, né?

  • «Olá!» – «Saluton!»
  • «Como vai você?» – «Kiel vi fartas?»
  • «Vou bem, obrigado.» – «Bone, dankon.»
  • «Onde fica o banheiro?» – «Kie estas la necesejo?»
  • «Que horas são?» – «Kioma horo estas?»
  • «Quinze para as duas da tarde.» – «Estas kvarono antaŭ la dua posttagmeze.»
  • «Quando vai embora?» – «Kiam vi foriros?»
  • «Ao meio dia.» – «Je tagmezo.»
  • «Você gosta de morangos?» – «Ĉu ŝatas al vi fragoj?»
  • «Sim, gosto.» – «Jes, ŝatas.»
  • «Já está na hora!» – «Jam temp'está!» (herdado do Pra-Esperanto)
  • «Vamos ao trabalho!» – «Ek al la laboro!»
  • «Minha nossa!» – «Ho ve!»
  • «Coitado do cachorro!» – «Ve al la hundo!»
  • «Onde você está indo?» – «Kien vi aliras?»
  • «Estou indo para casa.» – «Mi aliras hejmen.»


Agora já chega! Se quiser aprender procure o Kurso de Esperanto ou o KCE! Depois procure por Gerda malaperis!.

[]'s