A small talk about 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:- Em GNU Smalltalk pode ser a saída padrão ou, se você estiver usando o BLOX, a janela principal.
- Em Squeak e em Pharo é uma janela de mensagens.
- Em Cincom VisualWorks é a janela de mensagens principal.
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