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: block
aNumber to: anotherNumber do: block
aNumber to: aStopNumber by: aStepNumber do: block
aBlock whileTrue: anotherBlock
aBlock 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 aloop
na modalidade anterior,2.2 to: 5 do: block
equivale 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.
Esteloop
e 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: Paraabortar
umloop infinito
ou tentar ter de novo o controle do ambiente de programação que aparenta estar numloop infinito
use 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) tan
Date today
DateAndTime 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.