Conceitos fundamentais de Smalltalk #1

Data: October 10th, 2010 | Autor:

Estamos começando a estudar Smalltalk no NIC. A linguagem foi planejada originalmente por Alan Kay e Adele Goldberg no Xerox Parc, ainda nos anos 70. Se as interfaces gráficas significaram a facilidade de uso dos computadores, o Smalltalk era a facilidade de programação deles.

O Scratch, linguagem que estamos utilizando na disciplina de Design Computacional, é um descendente direto do Smalltalk, escrito numa implementação mais recente chamada Squeak. Alan Kay esteve diretamente envolvido no desenvolvimento do Squeak desde o início do projeto.

Experimentei várias implementações e a que parece ter o maior número de webcasts e atualizações é a Cincom Smalltalk. É uma versão gratuita, acompanha vários componentes para produtividade, e o mais bacana é a quantidade de vídeos com walkthroughs e tutoriais disponíveis no blog do fabricante.

Certamente os conceitos experimentados com o Cincom servirão para as demais implementações – Squeak, Pharo, GNU Smalltalk etc. Vamos aos conceitos iniciais, traduzidos da introdução do programa:

Tudo em Smalltalk é um objeto: um número, uma cadeia de caracteres (string), um retângulo etc.

A comunicação com objetos é sempre feita por meio do envio de mensagens: 2+2 significa que o objeto ’2′, número inteiro, recebe a mensagem ‘+’ com o argumento ’2′, que também é um objeto do tipo número inteiro.

Mensagens podem ser unárias, binárias ou palavras-chave. A diferença está na estrutura da mensagem (seu seletor):

  • mensagens unárias: compostas por uma única “palavra” (o identificador), não possuem argumentos. Ex: 2 squared (literalmente, 2 ao quadrado);
  • mensagens binárias: um ou mais caracteres especiais para o seletor (+ – / \ @ &…), seguido de um argumento. Ex: 2+2;
  • mensagens com palavras-chave podem ter qualquer número de argumentos e cada um deles é precedido por uma palavra-chave. O seletor consiste em uma ou mais palavras-chave (um identificador seguido de dois pontos ‘:’), e cada palavra-chave é seguida de um argumento. Ex: 3 between: 5 and: 10

OBS: Para um exemplo completo de um programa em Smalltalk verifique o Exemplo 1 abaixo.

Identificadores começam com letras minúsculas e contêm apenas letras e dígitos. Podem ter qualquer comprimento e são case sensitive, ou seja, asUppercase e asUpperCase são identificadores diferentes.

Toda mensagem retorna um objeto e portanto podem ser combinadas. Ex: ‘testando’ asUppercase reverse.

As mensagens retornadas como objetos podem ser utilizadas como argumentos de outras mensagens de estrutura binária ou palavra-chave. Ex:

3 raisedTo: 5 squared
ComposedTextView open: ‘abc’ asText allBold asValue

O uso de parênteses para separar partes das expressões também é válido. Os exemplos a seguir são equivalentes:

5 factorial between: 3 squarred and: 3*5*9
(5 factorial) between: (3 squared) and: (3*5*9)

No entanto, vale lembrar da Lei de Demeter, que faz algumas recomendações sobre concatenações sucessivas.

Mensagens são executadas da esquerda para a direita, com expressões entre parênteses primeiro, mensagens unárias em seguida, palavras-chave por último. Ex:

5 + 3 * 4

equivale a

(5+3) * 4

Mesmo desejando escrever 5 * 3 + 4, que terá o mesmo resultado de (5*3) + 4, o ideal é usar a segunda forma. Não há perda de performance e a leiturabilidade é preservada.

Uma sequência de expressões em Smalltalk é chamada fragmento de código (os ‘scripts’) e seus componentes são chamados declarações. Declarações são separadas por ponto final. Ex:

3 squared.
5 factorial

Declarações consecutivas podem ser escrita na forma em cascata, com o mesmo resultado (ver Exemplo 2 abaixo).

Após avaliar a mensagem, o Smalltalk descarta automaticamente o objeto retornado a menos que você o atribua a uma variável. Esse conceito chama-se coletor automático de lixo. A declaração das variáveis em Smalltalk deve ser feita antes do seu uso e não é necessário atribuir tipos.

| price tax total |        ”variáveis separadas por espaços”
price := (Dialog request: ‘Please enter price’ initialAnswer: ’100′) asNumber.
tax := (Dialog request: ‘Please enter price %’  initialAnswer: ’10′) asNumber.
total := price + (price * tax / 100).
Transcript clear;

show: ‘price: ‘, price printString; cr;
show: ‘tax: ‘, tax printString; cr;
show: ‘total: ‘, total printString

Em Smalltalk, as variáveis apenas apontam para os objetos. O sinal ‘:=’ é o operador de atribução e pode ser escrito com o atalho CTRL+g (Windows). Originalmente, uma seta representava o operador de atribuição no Smalltalk e em algumas implementações esse símbolo ainda é aceito. Utiliza-se o underscore (sublinhado) para exibir a seta de atribuição.

Este é o fim da primeira parte dos posts sobre Smalltalk. No próximo discutiremos objetos e classes, conceitos fundamentais da programação orientada a objetos. A seguir são listados os exemplos de código mais longos para demonstrar o potencial e facilidade de uso da linguagem.

Exemplo 1:

Dialog

choose: ‘Which line do you want?’
fromList: #(‘first’ ‘second’ ‘third’ ‘fourth’)
values: #(1 2 3 4)
lines: 4
cancel: [#noChoice]
for: Dialog defaultParentWindow

Exemplo 2:

Transcript clear.
Transcript show: ‘Alô mundo”.
Transcript cr.
Transcript show: ‘Primeiro programa em Smalltalk’

O código acima poderia ser escrito no formato cascata:

Transcript clear;
show: ‘Alô mundo’;
cr;
show: ‘Primeiro programa em Smalltalk’

Para executar os códigos, basta selecionar as linhas e selecionar Print it ou Do it com o botão direito ou CTRL+P (Windows).

Atualização em 10/10
Existe um tutorial interativo que apresenta os mesmos conceitos apresentados neste post na nova versão do Pharo, chamado Profstef. Como a intenção dessa série é apresentar a linguagem de maneira geral, abordaremos vários ambientes de desenvolvimento além do Cincom.

Para utilizar o ProfStef, baixe o Pharo, abra um novo Workspace (botão esquerdo do mouse -> Workspace) e digite:

ProfStef go


Categoria: Smalltalk | Tags: , , , | Comentários: 6 Comentários »

nicPong: Jabulaaaani…

Data: August 22nd, 2010 | Autor:

Experimentação de jogo simples com o Scratch. Setas movimentam o jogador. Você precisará do Java instalado para jogar.


Categoria: LDA | Tags: , , | Comentários: 1 Comentário »