Como funcionam as mensagens

Como funcionam as mensagens

Doggie Daddy

Índice das lições


A 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 unárias

Mensagens binárias

As mensagens binárias tem a seguinte forma: anObject message anotherObject.

Experimente com os exemplos de mensagens binárias abaixo.

Mensagens binárias

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.

Mensagens com palavras-chaves

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.

Ordem de execução

Parênteses alterando a ordem de execução

Abaixo vemos parênteses mudando a ordem de execução.

Parênteses alterando 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.

Aritmética

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.

Cascata

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.




Report Page