Como funcionam as mensagens
Doggie DaddyA computação no Smalltalk acontece através do envio de mensagem aos objetos.
Tipos de mensagens
Há três tipos de mensagens:
- Unária
- Binária
- Com palavras chaves (keyword message)
Mensagens unárias
O modelo para uma expressão contendo uma mensagem unária é anObject aMessage
.
Experimente com os exemplos de mensagens unárias abaixo.
Mensagens binárias
As mensagens binárias tem a seguinte forma: anObject message anotherObject
.
Experimente com os exemplos de mensagens binárias abaixo.
A segunda expressão 1 + 2 * 3
tem um resultado (9
) que surpreende quem está esperando um 7.
As expressões envolvendo somente mensagens binárias no Smalltalk são avaliadas sempre da esquerda para a direita em consequência da precedência adotada entre as mensagens. Numa expressão que só tem mensagens binárias todas tem a mesma precedência.
Se houver parênteses ((
e )
) o que está entre parênteses tem maior precedência.
Vamos usar parênteses supérfluos para mostrar a precedência na expressão 1 + 2 * 3
. Com os parênteses ficaria (1 + 2) * 3
.
Para forçar a execução da multiplicação antes da soma teria que colocar os parênteses da seguinte forma: 1 + (2 * 3)
. Ou então mudar a ordem como em: 2 * 3 + 1
.
As mensagens binárias recebem um único argumento. Na expressão 1 + 2 * 3
a narrativa deve dizer que o objeto 1
recebe a mensagem +
com o argumento 2
retornando 3
. Em seguida 3
recebe a mensagem *
com o argumento 3
retornando 9
.
Mensagem com palavras-chaves (keyword messages)
As mensagens com palavras-chaves tem a seguinte forma: anObject akey: anotherObject akey2: anotherObject2
para uma mensagem com dois parâmetros. As mensagens podem ter um ou mais parâmetros.
Experimente com as mensagens abaixo.
Ordem de execução da mensagens
Mensagens unárias são avaliadas primeiro. Depois as binárias. E finalmente as com palavras-chaves (keyword messages).
Nos exemplos abaixo experimente comparar o resultado das mensagens com a mesma mensagem com parênteses que não alterem a precedência de execução citada acima. O resultado deve ser o mesmo caso você tenha colocado corretamente os parênteses.
Por exemplo: 1 + 2 * 3
ficaria ((1 + 2) * 3)
sem que o resultado se alterasse.
Parênteses alterando a ordem de execução
Abaixo vemos parênteses mudando a ordem de execução.
Expressões aritméticas
As expressões aritméticas são percebidas com mais estranhamento por causa do conflito com a nossa forma de avaliá-las no contexto da matemática.
Pratique um pouco para entender como é no Smalltalk.
Mensagens em cascata
Quando concatenamos mensagens a partir da segunda ela é enviada para o objeto que é resultado da mensagem anterior. Em alguns casos não é o que queremos.
Quando queremos que uma mensagem seja endereçada ao mesmo objeto da mensagem anterior as separamos com um ;
.
A primeira expressão abaixo (3 + 4; * 5
) demonstra bem o caso. A narrativa fica assim: 3
recebe a mensagem +
com o argumento 4
retornando 7
. Como temos ;
separando esta primeira mensagem da segunda esta segunda mensagem não será enviada ao objeto resultante 7
mas sim ao objeto que recebeu a mensagem anterior que é o 3
. Por isso o resultado é 15
.
Analise as outras expressões abaixo por essa perspectiva.
Execute primeiramente a expressão Transcript open
(Do it
) para abrir a janela do Transcript onde vai ver os resultado (efeitos colaterais) das expressões seguintes.
Em seguida execute as 4 expressões seguintes. Na última tome o cuidado de realçar toda a expressão que ocupa 4 linhas antes de executá-la com Do it
.
Nomenclatura rigorosa para mensagens
A teoria mais exata sobre as mensagens define a sua forma diferentemente do que usamos acima. Embora seja muito comum a forma adotada acima.
A diferença em relação a definição rigorosa não é prejudicial mas pode levar à confusão ao pesquisar em outras fontes sobre o Smalltalk.
O que chamamos de mensagem na verdade é o seletor da mensagem.
Uma mensagem, definida rigorosamente, tem a seguinte forma: receptor selector arguments
onde o seletor e os argumentos estão misturados nas mensagem do tipo com palavras-chaves (keyword messages).
Por exemplo: na mensagem unária Date today
o receptor é Date
e o seletor é today
.
Na mensagem binária 1 + 2
o receptor é 1
, o seletor é +
e o argumento é 2
.
Na mensagem com palavras-chaves 4 between: 0 and: 10
o receptor é 4
, o seletor é #between:and:
e os argumentos 0
e 10
.
Encerramento
Encerre a sessão salvando a imagem.