Smalltalk - Uma das Primeiras Linguagens Orientadas a Objetos

Uma das primeiras linguagens de programação orientada a objetos (oo) foi o Smalltalk, o grande diferencial entre Smalltalk e a maiorias das outras linguagens oo é que tudo na linguagens são objetos, inclusive if, while e for não são comandos, são métodos por mais incrível que isto pareça.

A notação do Smalltalk é semelhante à escrita em inglês. Veja o código abaixo:

Transcript clear. Transcript cr. Transcript show:‘Olá Mundo’. Transcript cr.

Existe um objeto chamado Transcript que representa um console, isto é, um lugar onde as mensagens são exibidas. Na primeira linha, você está executando o método clear (limpar) do objeto Transcript. Na segunda linha é solicitado ao Transcript que pule de linha através do método cr, como um endl do C++ ou um “\n” do C ou Java. Na terceira linha, é solicitado ao Transcript que seja exibida a string ‘Olá Mundo’, através do método show: que recebe como parâmetro uma string. Quando você precisar passar várias mensagens para um objeto, é possível utilizar um ponto-e-vírgula separando as chamadas, como no exemplo abaixo:

Transcript clear; cr; show:‘Olá Mundo’; cr.

Voltando ao comandos de controle na maioria das linguagens: o if do Java, em Smalltalk é ifTrue:, um método declarado na classe Boolean que recebe com parâmetro (veja o sinal de dois-pontos após o nome do método) um bloco de comandos, que em Smalltalk são comandos que estão dentro de colchetes [ ]. Já o whileTrue: é um método definido nas classes BlockClosure e BlockContext, portanto se o bloco for avaliado e retornar um valor True, então o bloco passado como parâmetro para o whileTrue: será avaliado. O exemplo abaixo já integra vários conceitos:

| i | i := 9. Transcript clear. [ i > 0 ] whileTrue: [ Transcript show: (i asString), ‘ -> ‘, (i odd ifTrue: [‘Par’] ifFalse: [‘Ímpar’]); cr. i := i - 1. ].

Na primeira linha é definida a variável i, que em Smalltalk não precisa definir o tipo. Na segunda linha é realizado um comando de atribuição. A terceira linha declara um bloco [ i > 0 ] que ao ser avaliado retorna um True ou False, e este bloco recebe a chamada ao método whileTrue: que executará o outro bloco enquanto a condição for verdadeira. Agora a terceira linha vamos quebrar em partes para melhor entendê-la. Primeiro, concatenação de strings em Smalltalk é realizada através de vírgula, portanto a variável i está sendo convertida para string (i asString) e concatenada com a string ‘ -> ‘, que será então concatenada com a string ‘Par’ ou ‘Ímpar’. Para selecionar entre a string Par ou Ímpar é chamado o método odd para saber se o número é par, o resultado será um valor True ou False. Como o método ifTrue:ifFalse: está definido na classe Boolean, então podemos chamá-lo a partir do objeto retornado pelo método odd. Em Smalltalk um método que recebe mais de um parâmetro, possui o seu nome divido em partes, onde cada parte possui um símbolo de dois-pontos. Portanto, ifTrue:ifFalse: é um método que recebe dois parâmetros, no caso o bloco que contém a string ‘Par’ e o bloco que contém a string ‘Ímpar’. E para terminar, um comando de atribuição para diminuir o valor da variável i. A saída deste programa é a seguinte:

9 -> Par 8 -> Ímpar 7 -> Par 6 -> Ímpar 5 -> Par 4 -> Ímpar 3 -> Par 2 -> Ímpar 1 -> Par

Vejamos algo impressionante ao utilizar uma linguagem como o Smalltalk. Os testes a seguir daria trabalho para você conseguir implementá-lo em Java ou C:

Transcript clear. 1 to: 500 do: [:i | Transcript show: ‘2 elevado a ‘, (i asString), ’ é ‘, (2 raisedTo: i) asString; cr. ].

Transcript clear. Transcript show: 5000 factorial asString.

No primeiro trecho de código são impressos todos as potências de 2 entre 1 e 500, detalhe 2^500 gera um número com 151 dígitos (veja que já existe o método raisedTo: na classe Number). Agora, ao executar o segundo código, será impresso no Transcript o fatorial de 5000, que é um número com 16326 dígitos. Vai tentar fazer isto em Java!

Bom, para poder executar este programa é necessário utilizar uma IDE Smalltalk. Uma bastante conhecida é a Squeak! que possui o código aberto. Você pode baixá-la a partir do site oficial: http://squeak.org/, utilize o link da direita da tela para fazer o download, senão você terá que baixar separadamente, a máquina virtual, o código fonte e a imagem para poder começar a utilizá-la. Hoje, o link direto se você for um usário do sistema operacional Windows é:

http://ftp.squeak.org/3.10/win/Squeak3.10.2-7179-win32.zip. Basta descompactar e executar o programa Squeak.exe.

O local para realizar alguns testes como os exemplos acima é o Workspace, no Squeak abra a aba Tools (encontra-se no canto superior direita da janela) clique no ícone que indica o Workspace e arraste-o para o meio da tela. Faça o mesmo com o Transcript para poder ver o resultado da execução do seu programa. Para executar um trecho de código, basta selecionar o código e apertar (ou clicar com o botão direito em cima da seleção e selecionar a opção do it).

Para aprender mais sobre Smalltalk vá em sites como: