Robots

Por Francisco Ary Martins em 20 de agosto de 2007.
Tutorial de Squeak

Robots

screen.png Na tela várias figuras chamam a atenção. Vamos nos concentrar agora numa retangular com a palavra Bot e outra, com um círculo azul, parecendo um tanque de guerra visto de cima. Essa última figura é o nosso robot. Passando o ponteiro sobre o robot surge um balão com alguns dizeres, como na figura abaixo: bot-balloon.png

O balão mostra as coordenadas e a direção do robot.

Conteúdo:


Comandando robots

Clicando no robot aparece também um balão só que dessa vez é possível digitar um texto nele. bot-balloon-edit.png

Ao se pressionar a tecla Enter o texto é interpretado como um comando para o robot. Vamos digitar o texto conforme a figura abaixo e teclar Enter para ver o efeito:

bot-go-100.png

O robot deve avançar deixando um rastro como na figura abaixo:

bot-go-100-trail.png

Fabricando robots

Vamos colocar mais um robot em cena. Para isso precisamos fabricar um.

bot-class.png

Vamos usar a figura similar a que você vê acima e que fica no alto da tela. Aquela com a palavra Bot nela. O processo é similar ao que usamos para movimentar o robot anteriormente. Vamos clicar na figura e obter um balão onde vamos digitar a palavra new e teclar Enter. Veja a figura abaixo.

bot-class-new.png

Vai aparecer um outro robot próximo ao ponteiro do mouse. Inicialmente o robot está “preso” ao ponteiro do mouse e pode ser movimentado junto com o mesmo. Clique no local onde desejar que ele fique. Para mudar a cor dele para vermelho digite color: Color red no balão associado ao robot (você já sabe como fazer).

Veja a figura abaixo.

bot-color-red.png

Agora temos um robot azul e outro vermelho.

bot-red.png

Classes, objetos e mensagens

Em Smalltalk tudo é objeto! Ou quase tudo. As coisas mais insuspeitadas são objetos. Esta meta de uniformidade já foi implementada também em outras linguagens. Basta dar uma olhada em Lisp (somente listas) e Prolog (somente sentencas lógicas). No Smalltalk qualquer coisa que responda a uma mensagem é um objeto. Números, por exemplo. As classes também são objetos! As mensagens também retornam objetos e podem, por isso, responder a novas mensagens. Logo as mensagens podem ser pensadas como objetos (a rigor as mensagens são objetos mas veremos isso quando abordarmos meta-programação). Os blocos, que veremos mais adiante, também.

Outra característica é a sua sintaxe que procura ser coloquial. Espera-se que o estilo coloquial facilite a programação também até por crianças. Seu nome Smalltalk vem dessa idéia. Não é a toa que a linguagem foi escolhida para integrar o OLPC com suas classes eToys.

O que fizemos até agora, usando a facilidade dos balões, foi enviar mensagens aos objetos representados por figuras na tela. Enviamos a mensagem go: 100 ao robot que desde o início estava na tela. Depois enviamos uma mensagem new à classe Bot que era representada pela figura no alto da tela. Um novo robot então foi criado. Em seguida enviamos a mensagem color: Color red para o novo robot recém criado. Mais adiante vamos reproduzir o que fizemos interativamente por meio de um script. Você já deve ter observado outra figura na base da tela. É uma janela com o título Bot Workspace. Tudo que fizemos manipulando as figuras na tela pode ser feito escrevendo nesta janela.

Vamos experimentar.

Para remover os robots e suas trilhas na tela podemos clicar no botão Clear All. Na janela vamos digitar o script que vai repetir o que fizemos interativamente. A janela ficará como na figura abaixo: bot-workspace.png

Para executar o script clique no botão Do It All. O texto é todo selecionado e depois executado. Na tela vão aparecer dois robots como na figura abaixo:

two-bots.png

Vamos ver o que significa cada linha no script.

Na primeira linha temos |bot1 bot2| que é a forma de declarar as variáveis locais bot1 e bot2. No Smalltalk a variáveis não são tipadas e podem referenciar qualquer objeto.

Nota: Os nomes das variáveis e dos métodos começam com letra minúscula.

Na segunda linha temos bot1 := Bot new. que cria o primeiro robot. O sinal de := equivale ao _ e na janela do Bot Workspace o sinal de sublinhado é convertido para uma seta apontando para a esquerda (voltaremos a ele mais adiante). Bot new é um tipo de mensagem que tem as seguintes partes: receptor e seletor separados por espaços. O receptor, no caso, é a classe Bot e o seletor é new. O receptor executa um método cuja seleção depende do valor do seletor. O método contém um script contendo código para executar as ações necessárias. A seleção de qual método será acionado será objeto de uma discussão futura. Para simplificar as vezes dizemos que a classe Bot, um objeto, recebeu a mensagem new. Toda mensagem retorna um objeto. Uma referência para o objeto criado é armazenada através da variável bot1 usando o operador de atribuição :=. As referências a objetos, armazenadas nas variáveis, podem ser usadas depois para receber mensagens que são endereçadas ao objeto que referenciam. Por exemplo, Bot new, na segunda linha do script, retorna um objeto ou referência a um objeto que representa um robot. Essa referência é armazenada na variável bot1 que é usada na terceira linha para receber a mensagem go: 100. O ponto no final da linha é um separador e deve indicar o fim de uma mensagem e o começo de outra.

Nota: Os nomes das classes são escritos com a primeira letra maiúscula.

Na terceira linha temos bot1 go: 100. Essa mensagem, cujo receptor é o objeto bot1, criado na segunda linha, e o seletor é go: e com argumento 100. Esse é um novo tipo de mensagem em relação àquela da segunda linha. Ela possui um argumento. Note que o seletor é seguido de dois pontos. Isso indica que ele espera um argumento. A semântica dessa mensagem é acionar um método go: com argumento 100 que faz com que a figura que representa o primeiro robot na tela se desloque para frente de 100 (pixels).

Na quarta linha criamos o segundo robot de forma similar ao que foi feito na segunda linha.

Na quinta e última linha temos bot2 color: Color red. Aqui, na verdade, existem duas mensagens. Podiamos desmontar a mensagem em duas partes: aColor := Color red. bot2 color: aColor Primeiro enviamos uma mensagem red (aqui estamos usando uma linguagem menos rigorosa) à classe Color para obter um objeto da classe Color. Em seguida passamos esse objeto como argumento da mensagem color: a que o segundo robot vai responder alterando a sua cor. Aqui entrou em jogo a precedência entre as mensagens que pode ser expressa pela colocação de parentêses : bot2 color: (Color red). A colocação de parentêses é um recurso válido no Smalltalk para alterar a precedência na execução mas que aqui usamos só para realçar o que já ocorre. As mensagens sem argumento são executadas antes. O ponto no final da última mensagem é opcional já que não existe outra mensagem após a mesma. Lembre-se que os pontos são separadores e não finalizadores de mensagens.

Nota: Os nomes de variáveis, métodos e classes são identificadores. A regra para a formação de identificadores é que sejam uma sequência de letras e dígitos começando por uma letra.

Salvando o ambiente

Queremos voltar ao ponto em que estávamos quando reiniciar o Squeak na próxima vez. Para isso podemos usar a opção quit do menu:

menu.jpg

E selecionar Yes no diálogo:

quit-menu.jpg

Ou então, de forma equivalente e mais rápida, selecionar save and quit, que já salva o ambiente sem perguntar nada antes de encerrar. O encerramento com salvamento grava o estado do ambiente no arquivo .image. Salvar o ambiente, no Smalltalk, salva o estado atualizado de todos os objetos. Isso inclui o Bot Workspace, as imagens e desenhos traçados, estados de objetos “não vísiveis” que foram alterados, tudo mesmo. Esta é a forma básica de persistência no Smalltalk disponível para o usuário sem que seja necessário uma intervenção de códigos escritos pelo programador. É parte intrínseca do ambiente.

Resumo

O que aprendemos:

  • Passar o ponteiro do mouse sobre as figuras dos robots e da classe Bot para que exibam balões com descrições.
  • Comandar os robots clicando neles para que exibam um balão onde é possível digitar comandos.
  • Criar mais robots clicando na figura que representa a classe Bot para obter um balão onde digitamos new e executamos através da tecla Enter.
  • Trocar a cor do robot enviando a mensagem aBot color: Color red. aBot é um robot.
  • Que as mensagens sem parâmetros, como Color red, têm precedência de execução sobre as mensagens com parâmetros, como aBot color:. Que o uso de parênteses muda a precedencia de execução.
  • Que em Smalltalk tudo, ou quase tudo, é um objeto.
  • Que as mensagens tem várias partes: receptor, seletor e argumentos.
  • Usar a classe Bot, enviando a mensagem new para criar um robot.
  • Usar um robot, enviando a mensagem go: para avançar o mesmo deixando um rastro. Girar o robot com a mensagem turnLeft:.
  • Escrever um script e executá-lo no Bot Workspace.
  • Limpar a tela removendo os rastros e os robots.
  • Declarar variáveis.
  • Que as variáveis podem referenciar qualquer objeto, independente de que classe ele seja.
  • Que as os nomes das classes começam com letra maiúscula.
  • Que os nomes de variáveis e métodos começam com letra minúscula.
  • Que os nomes de variáveis, métodos e classes sâo identificadores. Que os identificadores são uma sequência de letras e dígitos começando com uma letra. (Nota: os seletores acompanham a regra para os nomes de métodos mas, futuramente, quando tratarmos em mais detalhes das mensagens veremos que existem variantes às regras aqui colocadas. Os seletores, por exemplo, podem terminar em : que é um caracter especial. E o sinal de + é um seletor usado para operações aritméticas, também.)
  • Que o operador de atribuição é := (dois pontos + igual) ou _ (sublinhado). Que os sinais := ou _ são convertidos para uma seta apontando para a esquerda.
  • Que os seletores com argumentos terminam em :(dois pontos).
  • Os .(pontos) são separadores entre mensagens.
  • Salvar o ambiente. Que o ambiente salvo retorna ao estado em que foi abandonado no último encerramento com salvamento. Os estados de todos os objetos são mantidos. Que essa é uma forma intrínsica de persistência do Smalltalk.
Anúncios

2 Respostas para “Robots

  1. Muito bom. Vou comecar a usar smalltalk em meus projetos.

  2. Hello there! This post could not be written any better! Reading this post reminds me of my good old room mate! He always kept talking about this. I will forward this page to him. Fairly certain he will have a good read. Thank you for sharing! ddgfdgadkege

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s