Na Programação Orientada a Objetos toda computação é ativada pelo envio de mensagens aos objetos. Em resposta a esta mensagem o objeto executa uma ação correspondente. Esta ação é descrita por meio de um método específico que realiza esta computação.
Em Smalltalk um método é descrito por uma sequência de expressões separadas entre si por um ponto.
Cada expressão retorna sempre um único objeto como resultado. Expressões dentro de métodos podem ser precedidas opcionalmente pelo caractere ^ (caret). A execução do método termina quando uma expressão precedida do caret (^) é executada, ou após a execução da última expressão da sequência. Note que não existe em Smalltalk a noção de comando diferenciada da noção de expressão.
Como será visto adiante, um método é sempre ativado pela execução de uma expressão de mensagem, que consiste do envio de uma mensagem a um determinado objeto, que é chamado de receptor da mensagem. Essa expressão se reduzirá ao valor retornado pelo método após ele terminar sua execução. O valor que um método retorna será o valor da última expressão executada, caso esta seja precedida do caret. Caso a última expressão executada no método não seja precedida do caret, então o método retornará uma referência ao receptor.
Uma expressão em Smalltalk assume a forma:
<receptor> <seletor-da-mensagem>
onde <receptor> denota o objeto para o qual a mensagem identificada pelo <seletor-da-mensagem> é enviada.
Existem 3 tipos básicos de mensagens em Smalltalk, a saber, unárias, binárias e mensagens com palavras-chave.
Mensagens podem ser encadeadas resultando em expressão mais complexas. Nesta situação, o objeto resultante da avaliação de uma mensagem é simultaneamente o receptor ou argumento de outra mensagem. Considere a expressão que se segue:
'abc' size factorial.
Nesta expressão, o receptor é o String 'abc' para o qual é enviada a mensagem unária size, resultando no objeto 3. Para este objeto é então enviada a mensagem factorial, resultando no objeto 6, que é o resultado final da avaliação da expressão acima.
Já no exemplo:
5 factorial + 'abc' size
há mensagens de categorias diferentes (unárias e binárias).
Para casos como este, a avaliação dos seletores é feita
na ordem indicada abaixo:
são avaliadas da esquerda para a direita. Todos os seletores binários tem a mesma precedência, (ao contrário das linguagens convencionais, onde multiplicação e divisão tem precedência sobre soma e subtração).
No exemplo acima, ambas as mensagens são unárias. Como ambas são da mesma categoria de mensagens, a avaliação é feita da esquerda para a direita: primeiro a mensagem size e em seguida a mensagem factorial.
Exemplo 1: r1 s1: a s2: b s3: c é interpretada
como uma mensagem ao objeto r1 com seletor s1:s2:s3: e argumentos
a, b e c.
Exemplo 2: r1 s1: (a s2: b s3: c) é
interpretada como uma mensagem a r1 com seletor s1: e com argumento
igual ao objeto resultante da mensagem ao objeto a com seletor s2:s3:
e argumentos b e c.
Exemplo 3: (r1 s1: a) s2: b s3: c é
interpretada como uma mensagem ao objeto resultante da mensagem r1 s1:
a, com seletor s2:s3: e argumentos b e c.
Todos os seletores unários tem a mesma precedência. Exemplo:
15 + list size é equivalente a 15 + (list size)
onde list é um Array de 3 elementos, e limite tem o valor 100. Arrays respondem à mensagem unária size com seu tamanho. Números respondem à mensagem max: umNumero com o maior entre os valores do receptor e do argumento. Números também respondem à mensagem unária sqrt com a raiz quadrada de si mesmos.
De acordo com as regras de avaliação, a expressão acima
é equivalente à seguinte expressão com
parênteses:
A expressão acima será reduzida de acordo com os passos
seguintes:
4 factorial between: 3 + 4 and: 'alo mamãe' size * 7
Quando de sua avaliação inicialmente são resolvidas as expressões que envolvam mensagens unárias (em vermelho), resultando em:
24 between: 3 + 4 and: 9 * 7
A seguir são resolvidas as mensagens binárias (em azul), resultando em:
24 between: 7 and: 63
Por último são resolvidas as mensagens do tipo palavra-chave, neste caso retornando true já que 24 está entre 7 e 63.
Parênteses podem ser usados para alterar a ordem de avaliação: