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.
![](/file/4e3badc3bc294a9421614.png)
Mensagens binárias
As mensagens binárias tem a seguinte forma: anObject message anotherObject
.
Experimente com os exemplos de mensagens binárias abaixo.
![](/file/2387c87b375e75943b82b.png)
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.
![](/file/053d2b967063615c4913c.png)
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.
![](/file/1941097fdafdd29ee1ba2.png)
Parênteses alterando a ordem de execução
Abaixo vemos parênteses mudando a ordem de execução.
![](/file/0eab53e9271378ab7b526.png)
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.
![](/file/8d3c5fc0b38ed779955cb.png)
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
.
![](/file/b54264d9c72317b4d6559.png)
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.