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