sábado, 19 de abril de 2008

Peculiaridades do GNU Smalltalk

VisualWorks Visual Works é uma ótima ferramenta para desenvolvimento de grandes sistemas em Smalltalk, no entanto suas limitações na versão gratuita são extremamente incômodas.

Há algumas boas alternativas ao Visual Works, como Squeak e GNU Smalltalk.

Como sou fã do Projeto GNU, escolhi como substituto GNU Smalltalk.

Mas GNU Smalltalk também tem lá seus inconvenientes, todos contornáveis com a criação de uma nova imagem personalizada, o que pode ser feito na linha de comando ou com a ajuda da ferramenta gráfica Blox.

Também podemos resolver esses «inconvenientes» no próprio código. Por exemplo, cadê a potência (#**)?

[update 2008-06-12]O trouxa aqui não sabia que os números em Smalltalk respondem à mensagem raisedTo:. =P[/update]


Vamos calcular potência de dois em GNU Smalltalk:
#!/bin/sh
"exec" "gst" "-f" "$0" "$@"

Number extend [
** val [
| aux |

aux := 1.
1 to: aux do: [ :i |
aux := aux * self
].
^aux.
]
].


0 to: 10 do: [ :i |
Transcript
show: i printString;
tab;
show: (2 ** i) printString;
cr.
].


Claro, esta não é uma solução definitiva para potência, apenas um quebra-galho.

A mensagem extend estende os recursos de uma classe acrescentando novos métodos, no caso #** (potência).

Vamos agora ao cálculo de números primos…

O método #at:ifAbsent: de Dictionary, quando retorna o valor por defeito, não o retorna diretamente, mas passa a ele a mensagem value, que quase nenhuma classe trata.

Então precisamos estender Object para tratar a mensagem:
#!/bin/sh
"exec" "gst" "-f" "$0" "$@"

Object extend [
value [
^self
]
].

count := 0.
max := 5000.
primeList := Dictionary new.

primeList at: 1 put: false.

2 to: max do: [ :i |
(primeList at: i ifAbsent: true) ifTrue: [
Transcript show: i printString; tab.
count := count + 1.
(i * 2) to: max by: i do: [ :j |
primeList at: j put: false
]
]
].

Transcript
cr;
show: 'Quantidade de primos: ', count printString;
cr.


Conforme for encontrando outras peculiaridades do GNU Smalltalk, vou postando aqui.

[]'s
Cacilhas, La Batalema
blog comments powered by Disqus