SMALLTALK: FUNDAMENTOS DA LINGUAGEM - PARTE 1

Antes de falarmos dos fundamentos, vamos apresentar dois recursos do Squeak-Etoys que vamos usar muito: o Workspace e o Transcript.

São duas janelas que colocamos na tela usando a janela "World" e clicando Open.

Depois é só clicar em seus nomes.

No Workspace podemos digitar um programa, por exemplo:

|a|
a:='HELLO WORLD'.
Transcript show: a.

Para teclar, no emulador, a barra vertical é a minúscula da tecla fecha-colchetes/fecha-chaves. Dois-pontos é a maiúscula da tecla cê-cedilha. No meu notebook pelo menos ...

Escrito o programa, arraste o cursor sobre todas as linhas (que ficam verdes) e aperte Alt+s com o cursor ainda dentro da janela. Para executar aperte Alt+d.

A saída do programa aparece no Transcript.

Mas vamos então aos tais fundamentos.

É nosso pressuposto que você conhece alguma linguagem de programação: Java ou C++ ou VisualBasic ou etc. Parafraseando aquela propaganda: a primeira linguagem a gente nunca esquece. Certamente você ama a linguagem que aprendeu e odeia todas as outras. E certamente vai dizer que "Smalltalk é uma droga, linguagem boa mesmo é ...(colocar aqui o nome de sua primeira linguagem)..." Eu, que comecei a trabalhar com computadores em 1969 na IBM, acho que bom mesmo é Assembler (depois é Cobol) mas... vamos deixar de lados essas limitações da nossa natureza anti-mudanças e tentar aprender Smalltalk para programar para os garotos do OLPC.

Alguns conceitos são comuns a várias linguagens. Uma Classe é um grupo de métodos (funções, subrotinas, mensagens) que podem ser executadas usando um objeto (uma instância, um objeto-referência, um prefixo, um pointer) dessa Classe.

Para criar um objeto da Classe X, por exemplo, escrevemos, em Smalltalk, o statement:

            x := X new. 

O símbolo ":=" é o operador de assinalamento no Smalltalk.

Todo statement termina com um "ponto". Isso pode ser dispensado no último do programa (script) - o que não gostamos de fazer.

Para executar um método que se chamasse theMet1 da Classe X escreveríamos então:

          x theMet1. 

Um método poderia ter um parâmetro com o nome par1 e a sintaxe será algo como:

          x theMet2:par1.

Um parâmetro pode ser um objeto de outra Classe.

Se você quizer criar um método que recebe três parâmetros e retorna a qualquer coisa feita com eles, a sintaxe seria:

sumOfThree:a with:b plus:c

^ (a+b+c).

Claro que o nome não precisa ser em inglês mas as outras palavras sim. Por isso, uma idéia é por tudo em inglês, para não ficar muito maluco. Programadores devem se acostumar a usar a lingua inglesa.

Repare o sinal de "return" (o acento circunflexo).

O pessoal do Smalltalk gosta de dizer coisas esotéricas como: "O objeto x recebe a mensagem theMet1" significando que o método theMet1 da Classe X foi executado usando o objeto x.

Toda Classe tem um "método construtor" que é executado quando a Classe é "instancializada" - quando se cria um objeto dela. O nome desse método é: initialize.

Num statements de criação de um novo método para uma Classe (ou um novo script para um objeto com representação gráfica, como fizemos para Text) podemos usar a execução de método de outra Classe ou algum já definido da mesma. Para usar um método da mesma classe usamos o prefixo/objeto self.

Alguns métodos contêm variáveis que precisam ser definidas no início do método, entre barras. Por exemplo:

      | var1  var2   var3  |

Essas variáveis são locais ao método.

Não é comum a definição de propriedades em Smalltalk. Usamos métodos para simular isso. Podemos ter, por exemplo, o método: color:c. Se usamos:

      x color: c 
o objeto x tem a color c.

O Smalltalk aceita herança. Isso significa que podemos crar uma subClass Y para a Classe X. Essa subClass herda todos os métodos da outra (a superClasse) . Veremos como criar subClasses futuramente. Na realidade todas as Classes são subClasses da Classe Object e o que nós criamos são sempre subClasses.

Nós podemos modificar um método de uma superClasse escrevendo um método, na nossa Classe, com o mesmo nome. Se diz que esse novo método "overraida" (overrides) o outro.

Se não "overraidamos" o método "initialize" da superClasse, esse será executado quendo se instancializa a subClass.

Um determinado grupo de Classes do Smalltalk é chamado de imagem. Diferentes imagens de Smalltalk podem ser didtribuidas por diferentes companhias, grupos, entidades etc. Por exemplo temos a imagem do grupo "Squeak-Croquet" que é diferente da imagem do "Squeak-Etoys" etc. etc.

Se você cria uma nova subClass ou novos métodos para uma Classe existente no Squeak-Etoys de seu micro OLPC e dá um "Save geral" você cria SUA imagem que é diferente da original que veio instalada no seu micro OLPC. Você pode distribuir as modificações que fez para um amigo, se quiser que ele execute projetos que você criou usando esses elementos "não padrão" (digamos assim). Se você cria projetos usando só as Classes "padrão" do Squeak-Etoys (como no primeiro exercício) você precisa só distribuir o projeto - é mais fácil.

Na maioria das linguagens compiladas, tipo C++, temos o ciclo "compile-link-run" e uma aplicação compilada é independente de uma mudança que fazemos numa Classe da API. No Smalltalk é diferente. Você pode mudar um método da "imagem" e todas as aplicações que usam esse método serão alteradas pois o que temos é uma espécie de máquina virtual que faz uma compilação do script "just in time". Cuidado então quando mudar uma Classe da sua imagem. Se preferência não faça isso: crie uma subClass.

É usual que o nome de uma Classe comece com maiúscula. Nomes de métodos começam com minúscula e podem ter maiúsculas no meio.

Se um parâmetro de um método é um string, é colocado entre apóstrofos

  
   st Student new.
   st name:'Carlos Silva'.

Atenção porque não temos propriedades no Smalltalk (temos variáveis, claro) e seria incorreto usar;

  st name := 'Carlos Silva'.

No caso "name" não é uma variável. Repare que está sendo "chamada" por um prefixo/objeto.


              LIÇÃO ANTERIOR       PRÓXIMA LIÇÃO             
ÍNDICE HOMEPAGE