Loops
Doggie DaddyLoop ou repetição são estruturas para voltar a executar um conjunto de expressões em condições diferentes até que seja atingida uma condição que encerre a repetição.
Alguns loops básicos
Assim como o Smalltalk não possui estruturas sintáticas para condicionais, que usam mensagens e blocos, também ocorre a mesma coisa com os loops que são implementado com mensagens, blocos e recursão.
Vamos abordar algumas formas:
timesRepeat:to:do:to:by:do:whileTrue:whileFalse:
As mensagens são como abaixo:
anInteger timesRepeat: blockaNumber to: anotherNumber do: blockaNumber to: aStopNumber by: aStepNumber do: blockaBlock whileTrue: anotherBlockaBlock whileFalse: anotherBlock
timesRepeat loop
A mensagem timesRepeat: é enviada a um número inteiro, o que determina o número de vezes que o bloco, que é seu argumento, será avaliado.
Observe que o bloco não tem um argumento e perfaz a sua computação com base num contexto que o envolve e que mantém os valores mostrados no Transcript na variávelx, que vai sendo incrementada a cadaloop.
Na primeira linha no Playground está uma declaração de variável:| x |. Outro exemplo de declaração de variáveis é| x y z |. As variáveis devem ser declaradas antes do seu uso no Smalltalk. No Playground as variáveis são declaradas automaticamente e você não precisa se preocupar com isto. Mas se quiser declarar pode fazê-lo. Nós fizemos aqui para evitar algumas mensagens de advertência que apareceriam no Transcript se não o fizéssemos.
Execute os exemplos no Playground com Do it.Abaixo um exemplo do loop do tipo timesRepeat.

to do loop
A mensagem to:do: é enviada a um número, que inclui inteiros mas também frações e números de ponto flutuante. O seu segundo argumento também é um número nesse sentido. O terceiro argumento é o bloco que vai ser repetidamente executado.
A partir do número passado como primeiro argumento o bloco vai recebendo como argumentos, a cada loop, este número e os subsequentes incrementados de 1 e saindo do loop quando algum número atinge um valor maior do que o segundo argumento.
Por exemplo: 1.5 to: 5.2 do: aBlock vai iterar o loop passando para o bloco 1.5, 2.5, 3.5 e, finalmente, 4.5.
Abaixo um exemplo do loop do tipo to do.

to by do loop
A mensagem to:by:do: é enviada a um número, que inclui inteiros mas também frações e números de ponto flutuante. Em relação ao loop anterior ela possui mais um argumento que representa o incremento entre os números passados ao bloco.
Por exemplo: O loop da expressão 2/3 to: 1.3 by: 1/4 do: block passa os seguintes números para o bloco a cada loop: 2/3, 11/12 e 7/6.
A expressão, usando aloopna modalidade anterior,2.2 to: 5 do: blockequivale a2.2 to: 5 by: 1 do: block(o incremento de1é o default).
Abaixo um exemplo do loop do tipo to by do.

whileTrue loop
A mensagem whileTrue: é enviada a um bloco que a cada vez que for avaliado com true causa a execução do bloco que é seu argumento. Quando for avaliado pela primeira vez como false o loop termina sem que o bloco que é o seu argumento seja avaliado.
Esteloope o próximo são mais gerais e, diferentemente dos anteriores, não contém uma garantia de que não vá ser umloop infinito, isto é, uma repetição que nunca para, nunca termina a sua computação. Quando umloop infinitoé encontrado o ambiente parece ter travado.
Dica: Paraabortarumloop infinitoou tentar ter de novo o controle do ambiente de programação que aparenta estar numloop infinitouse a combinação de teclasCmd + .ouCtrl + .
Abaixo um exemplo do loop do tipo whileTrue.

whileFalse loop
A mensagem whileFalse: é enviada a um bloco que a cada vez que for avaliado com false causa a execução do bloco que é seu argumento. Quando for avaliado pela primeira vez como true o loop termina sem que o bloco que é o seu argumento seja avaliado.
Abaixo um exemplo do loop do tipo whileFalse.

Estrutura de controle
Com esta lição você está de posse das três estruturas básicas de controle que permitem a computação de qualquer coisa que for computável.
A três estruturas são:
- Sequência
- Decisão
- Repetição

Sequência
Uma sequência de expressões é executada de cima para baixo e da esquerda para a direita.
Exemplo:
5 factorial. (Float pi / 4) tan. Date today. DateAndTime now
Vai executar na seguinte ordem:
5 factorial(Float pi / 4) tanDate todayDateAndTime now
Decisão
A decisão pode ter dois blocos alternativos, uma para uma avaliação true e outro para o false. Mas um dos blocos pode ser nulo ou omisso.
| x |
x := 41.
x < 42 ifTrue: [
x := x + 1
]
Repetição
A repetição usa dois blocos. Uma para a condição de parada e outro para a execução repetida.
| x |
x := 0.
[ x < 42 ] whileTrue: [
x := x + 1
]
| x |
x := 0.
[ x = 42 ] whileFalse: [
x := x + 1
]
Encerrando
Encerre a lição e o ambiente salvando a imagem.