2010-04-30

A small talk about Smalltalk

Smalltalk Este artigo bem poderia ir para o Kodumaro, mas há um bom motivo para estar aqui: este artigo não é voltado para os programadores!

Este artigo pretende demonstrar que Smalltalk é uma linguagem tão simples que qualquer um pode entender sua estrutura básica de comando em alguns minutos.

Por exemplo, espero que, ao final deste artigo, o leitor ache familiar a escrita alienígena abaixo:

Transcript
show: (3 + 2) printString;
cr.


Todo comando em Smalltalk é formato por um objeto e uma ou mais mensagens. O objeto recebe a(s) mensagem(ns) e responde outro objeto.

— Mas o que é um objeto?

Um objeto é qualquer coisa. É verdade! Você entendeu sim! Qualquer coisa… é mais fácil entender o conceito do que aceitar. Portanto poupe a você mesmo muito tempo e aceite que um objeto é qualquer coisa.

Por exemplo, o número -3 é um objeto.

Mensagem é uma instrução que você passa para o objeto executar. Por exemplo:
-3 abs


Então o objeto -3 recebe a mensagem abs, que é uma pergunta. É como se você perguntasse:

— Ei, objeto -3, qual seu valor absoluto?

Em Smalltalk há três tipos de mensagem: unária, binária e palavra chave.

Unária é a mensagem que possui apenas um seletor, como no caso acima (o seletor é #abs¹).

Binária é como operações matemáticas, por exemplo a soma:
3 + 2


O objeto 3 recebe a mensagem + 2, que é como perguntar:

— Objeto 3, o que eu recebo se somar você com o objeto 2?

O seletor binário então (#+) precisa receber um segundo objeto, daí «binário».

Uma mensagem com palavra chave é um pouquinho mais complexa, mas ainda assim fácil de entender.

Veja a mensagem:
2 raisedTo: 5


— Objeto 2, quanto é você elevado (#raisedTo:) ao objeto 5?

Então a mensagem com palavra chave recebe um parâmetro, que é outro objeto. Esse tipo de mensagem pode receber mais de um parâmetro, por exemplo:
{ 1. 1. 2. 3. 5. } at: 2 ifAbsent: [0]


O seletor #at:ifAbsent: pergunta pra «lista» (a palavra correta aqui seria array) qual seu segundo valor (objeto 2 passado como primeiro parâmetro, para palavra chave at:, indica segundo valor, com é óbvio) e, se não houver (ifAbsent:), retorna zero (que é o resultado de [0])². No caso, a resposta será 1.

Você pode passar mais de uma mensagem para um objeto, separando as mensagens com ponto-e-vírgula:
{ 1. 1. 2. 3. 5. } asOrderedCollection add: 8; yourself


Aqui a lista (array) recebe a mensagem asOrderedCollection, que retorna uma coleção ordenada (ordered collection em inglês), então a mensagem add: 8 é recebida por essa coleção, que adiciona (add) o objeto 8, depois o objeto coleção recebe outra mensagem, yourself (você mesmo), que pede para que ele retorne ele próprio.

Espero que tenha ficado claro até aqui! Tudo o que foi dito é só: ei objeto, responde essa mensagem aí!

Quando você terminar de enviar mensagens para um objeto, coloque um ponto final, como quem termina uma frase:
3 + 2.


Mas ainda há um script alienígena lá em cima, no começo deste artigo, que merece ser explicado!

Em Smalltalk existe um objeto chamado Transcript, que pode ser coisas diferentes em implementações diferentes:


No geral, Transcript é um sujeito que exibe as coisas para você.

O seletor #show: diz para o Transcript mostrar (em inglês, show) alguma coisa, mas essa «coisa» precisa ser um objeto que ele saiba mostrar. Para que um número responda um objeto que o represente e que o Transcript saiba mostrar, usamos a mensagem printString.

O seletor #cr diz ao Transcript para acrescentar uma mudança de linha.

Sabendo disso, diga-me você o que faz este trecho de código:
Transcript
show: (3 + 2) printString;
cr.


Observação¹: você pode ter ficado meio confuso com uma tralha que aparece de vez em quando. Eu explico!

Quando você vê:
2 raisedTo: 5.


O objeto é 2 e a mensagem raisedTo: 5. Esta mensagem é formada de duas partes, uma palavra chave (raisedTo:) e um parâmetro (o objeto 5). O que acontece na verdade é que o seletor #raisedTo: do objeto 2 é acionado com o parâmetro 5 pela mensagem, retornando 32.

Os nomes dos seletores sempre são iniciados com #.

Observação²: quando a mensagem possui mais de um parâmetro, o seletor é representado juntando todas as palavras chave. Então em:
{ 1. 1. 2. 3. 5. } at: 2 ifAbsent: [0].


O seletor é #at:ifAbsent:.

Creio que, depois deste artigo, Smalltalk não soe mais tão alienígena e talvez algumas pessoas até se interessem em aprender um pouco mais!

[]’s
Cacilhας, La Batalema