Voltando aos primórdios da programação OO
Depois de um tempo parado, queria falar sobre uma linguagem responsável por roubar meu tempo todos esses dias em um trabalho da disciplina de “Linguagens de Programação” no meu curso… Smalltalk, ou mais precisamente o ambiente Gnu-Smalltalk!
Assim como Python, Smalltalk é uma linguagem em que tudo é objeto! Bem mais velha que Python, criada na década de 60 pelo pessoal do MIT, essa linguagem possui vários ambientes como Squeak, Gnu-Smalltalk, etc na qual é dependente, mudando um pouco sua sintaxe para cada um deles.
O proveito que tirei dessa linguagem, foi trabalhar em cima do paradigma OO de forma mais consistente e intuitiva. Sem dúvida aumentei meus conhecimentos em programação OO e uma boa prática será aplicar esses conhecimentos em outras linguagens que também carregam esse paradigma (Python :)).
A seguir, um exemplo simples da um série matemática que eu gosto, a série de fibonacci:
1º começo declarando uma classe:
1 2 3 4 5 | Object subclass: #Fibonacci instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' ! |
Depois documento os métodos que irei utilizar e escrevo o método chamado “calcula”:
6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ! Fibonacci methodsFor: ’série de fibonacci’ ! calcula: n | conj | n > 2 ifTrue: [^n] ifFalse: [conj := Array new: n. conj at: 1 put: 0. conj at: 2 put: 1. 3 to: n do: [:i | conj at: i put: ((conj at: (i - 2)) + (conj at: (i - 1)))]. ^conj ]. !! |
Repare que cada expressão é terminada com um ponto “.”, exceto a última expressão do método que pode vir ou não um ponto.
Definimos o fim do método com uma exclamação “!”, ou se for o último método da classe como no meu exemplo, é colocado duas exclamações, a primeira finalizando o método e a segunda finalizando a classe.
O sinal de circunflexo “^” antes de um objeto, define o retorno de um valor. De acordo com o exemplo, se o parâmetro “n” for menor que 2, retorna o valor dele mesmo, senão é feito o algoritmo depositando a sequência dentro de um array declarado com o tamanho do “n” passado.
Por fim, pegamos um número passado como parâmetro no terminal e instanciamos a classe “Fibonacci” para o objeto “x”:
20 21 | args := Smalltalk arguments. x := Fibonacci new. |
Com o objeto “x” instanciado, chamamos o método calcula passando como parâmetro, o número digitado pelo usuário no terminal:
22 | (x calcula: (args at: 1) asInteger) printNl. |
Agora é só salvar o código e executá-lo da seguinte forma na linha de comando (Baixe-o aqui se preferir):
$ gst fibonacci.st -a 7
Onde “gst” é o compilador, “fibonacci.st” é o nome do fonte, “-a” diz que queremos passar um parâmetro logo a frente e 7 é a quantidade de números da sequência que queremos imprimir.
No Ubuntu, o pacote chama-se “gnu-smalltalk”. Para instalar é só usar o aptitude ou outro gerenciador de pacotes que estão acostumados e sair brincando!
Tags: gnu-smalltalk, OO
May 25th, 2008 at 9:52
Aproveitando o ensejo do camarada e colega de sala Rodrigo, venho fazer algumas ressalvas importantes sobre a linguagem que em minha opnião fazem a diferença na hora de escrever o código e podem ajudar a muitos que já estão “rancando os cabelos” por não saber o porque o código não está compilando ou apareceu aquele “errinho” de uma hora para outra.
* Evite a utilização excessiva de comandos de impressão em tela, como o printNl e o transcript. Ao coloca-lo em fors e whiles, os mesmos são alocados na pilha, haja a vista que o programa é totalmente orientado a objetos. Isto pode causar estouro de pilha em determinados casos.
* Não sei porque razão, o metodo isNumber não funcionou adequadamente nos testes que fiz. Isto causou uma grande perda de tempo. Então, é mais interessante implementar um metodo proprio em sua classe que devolva essa resposta pra você.
* Sempre que abrir um comando de bloco de instruções, como IfTrue:[]. ou whileTrue:[]. e afins, feche o bloco imediatamente. Pois em um codigo com algumas linhas e varios ifTrues aninhados, fica um pouco dificil de verificar qual está faltando…
* Variaveis com letras iniciando com maiuscula no programa principal, desde que declaradas com Smalltalk at: #var put: (tipo new). são globais, e são visiveis no programa em geral.
Acho que é só. A todos que tenham a curiosidade de “brincar” com uma linguagem TOTALMENTE orientada a objetos, uma BOA SORTE!
Abraço.
Tiago H. Bordoni
May 27th, 2008 at 1:54
Cara…
Incrível como qualquer linguagem que tenha a sintaxe bem diferente de C é assustadora!!! ahhaha
Esses dias cai numa página que falava das diferenças entre Smalltalk e Java:
http://blog.danielfmartins.com/2007/05/07/smalltalk-x-java/
E um outro fez a comparação dos mesmos códigos em Python:
http://blog.elcio.com.br/python-x-java-x-smalltalk/
Já ouviu falar de linguagens esotéricas? e Whitespace?? Isso sim é loucura!!!
http://compsoc.dur.ac.uk/whitespace/index.php
Abraço Hubão!
May 27th, 2008 at 2:56
Engraçado também você ouvir falar tanto da linguagem depois que você trabalha com ela! Eu nem sabia que Smalltalk era linguagem de programação, depois que precisei, comecei ver em todo lugar…
Quanto a linguagem Whitespace eu ouvi falar na primeira aula de linguagens de programação, hehe! Eu fiquei imaginando um professor pedir um trabalho de programação impresso, e você entregar um monte de folha em branco pra ele…