Reverter strings (lendo-as da direita para a esquerda, em vez de da esquerda para a direita) é uma tarefa surpreendentemente comum na programação.
Por exemplo, na bioinformática, reverter a sequência de strings de DNA ou RNA costuma ser importante para diversas análises, como encontrar fitas complementares ou identificar sequências palindrômicas que têm significado biológico.
Sua tarefa é inverter uma string.
Alguns exemplos:
"stressed" em "desserts"."strops" em "sports"."racecar" em "racecar".Embora existam os métodos #reversed e #reverseDo: para strings, você consegue descobrir como fazer isso por conta própria usando iteração de caracteres e streams de mais baixo nível?
Para ajudar você a navegar pelo código, o Pharo tem uma ferramenta de busca de código bem legal. Pressione Shift-Enter para ativá-la.
NOTA: seguimos a convenção do Exercism de chamar a solução de ReverseString, mas um nome mais Smalltalk seria StringReverser.
Em relação a strings, existem alguns detalhes pequenos e óbvios, como aspas duplas para comentários, aspas simples para strings e uma sintaxe especial para caracteres (por exemplo, $x para o caractere "x"), que podem confundir você na primeira leitura, já que as convenções são diferentes das usadas em outras linguagens.
Há também a noção de símbolo, que é uma string única em toda a memória; ou seja, quando ele é construído (normalmente em tempo de compilação), é feita uma busca na memória para determinar se já existe outro igual, e só o original é usado. A justificativa não é apenas economizar memória, mas também um ganho de velocidade significativo na comparação de símbolos.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
Além disso, há pouquíssimas vírgulas nos programas Smalltalk, porque elas não têm papel sintático.
É por isso que literais de array, por exemplo, não têm vírgulas; por exemplo,
#(1 2 3 4 5)
No entanto, a vírgula é um operador por si só, e você vai notá-la ao concatenar duas strings; por exemplo,
'string1', 'string2'
Por fim, vale saber que strings e caracteres são classes distintas. Uma string é uma coleção de caracteres. Isso pode pegar você de surpresa ao iterar sobre strings, porque você pode acabar passando caracteres para um método que espera strings. Considere...
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
Os streams são úteis para leitura e escrita sequencial. Eles deixam o código mais limpo, evitando a necessidade de incrementar um índice. Os streams funcionam com qualquer coleção.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
Crie sua conta no Exercism para aprender e dominar Pharo com 50 exercícios e mentoria humana de verdade, tudo de graça.
Explore 14 maneiras diferentes de inverter uma string, passando por vários tópicos, como pontos de código Unicode, grafemas, alocações na pilha versus no heap e ponteiros. Relaxe e aproveite 45 minutos de aprendizado com Jeremy e Erik.