Torna all'elenco delle lezioni I cicli

di Daniele Forsi versione 0.2 del 14 gennaio 2000

Indice

Perché servono i cicli
for parola inizio fine salta blocco
forall parola-serie blocco
foreach parola-o-blocco serie blocco
forever e break
forskip parola-serie salta blocco
loop numero blocco
repeat parola numero-o-serie blocco
until blocco
while condizione blocco
Parole attinenti ai cicli

Perché servono i cicli [Indice di questa lezione]

Sarebbe impossibile o poco pratico duplicare una pezzo di programma per eseguire operazioni ripetitive, specialmente se non si conosce a priori il numero di ripetizioni da compiere, per questo scopo ogni linguaggio di programmazione evoluto ha dei comandi specializzati, chiamati costrutti iterativi e ogni ripetizione si chiama iterazione.
In REBOL è possibile valutare un blocco di valori (in altri linguaggi si direbbe "eseguire delle istruzioni"), tante volte quanti sono i valori di una serie (con forall, foreach, forskip e repeat), un numero non prefissato di volte (con forever, until e while) o un numero prefissato di volte (con for, loop e repeat). È importante ricordare che il blocco viene valutato e il valore dell'ultima valutazione può essere usato a piacimento (il valore dell'ultima iterazione è quello dell'ultima parola del blocco o quello fornito tramite break/return valore).
Un'altra cosa importante da ricordare è che le parole che accettano un argomento il cui valore è di tipo serie possono lavorare indifferentemente sui tipi series money date object port time tuple any-function.Esempi for forall foreach forskip forever e break loop repeat until while

for parola inizio fine salta blocco [Indice di questa lezione]

I valori di inizio, fine e salta possono essere integer, decimal, series, money, time, date oppure char; salta può essere un numero intero oppure con la virgola: è sufficiente che inizio e fine siano dello stesso tipo.
Se inizio è maggiore di fine il ciclo non è eseguito, altrimenti alla prima iterazione parola assume il valore di inizio e ad ogni succesiva iterazione è aggiunto il valore di salta. La parola è locale al ciclo.

(esempio con numeri decimali)
for i 5.3 6.6 0.2 [
    print i
]
Risultato:
5.3
5.5
5.7
5.9
(esempio con date)
for i 1/1/2000 31/12/2000 30 [
    print i
]
Risultato:
1-Jan-2000
31-Jan-2000
1-Mar-2000
31-Mar-2000
30-Apr-2000
30-May-2000
29-Jun-2000
29-Jul-2000
28-Aug-2000
27-Sep-2000
27-Oct-2000
26-Nov-2000
26-Dec-2000
(Nota: for ritorna l'ultimo valore del blocco, a meno che non si usi break/return, ma print non ritorna nessun valore)

forall parola-serie blocco [Indice di questa lezione]

parola-serie è una parola il cui valore è di tipo serie (non si può usare direttamente una serie letterale) e all'uscita del ciclo parola-serie è posizionata in fondo alla serie, per cui se si desidera usarla di nuovo è necessario posizionarla all'inizio (nell'esempio di dovrebbe usare: giorni: head giorni).
All'interno del ciclo si può individuare il valore corrente tramite first (nell'esempio: first giorni).
giorni: [ lunedì martedì mercoledì ]
forall giorni [
    print first giorni
]
Risultato:
lunedì
martedì
mercoledì
== false
(Nota: il valore ritornato da forall è sempre false, a meno che non si usi break/return)

foreach parola-o-blocco serie blocco [Indice di questa lezione]

parola-o-blocco può essere di tipo word! (una parola) o di tipo block! (un blocco letterale contenente una o più parole); in entrambi i casi le parole fornite sono usate per creare delle parole locali al ciclo.
Se è stata fornita solo una parola ad ogni iterazione del ciclo tale parola assume il valore dell'elemento corrente del blocco, se sono fornite più parole ognuna assume il valore del successivo elemento corrente del blocco.
Nell'esempio è fornito un blocco di due parole per cui la prima volta la parola a assume il primo valore e b il secondo, la seconda volta a assume il terzo valore e b il quarto, la terza volta a assume il quinto valore e b assume il valore none perché manca il sesto valore (ogni volta che mancano dei valori per terminare l'ultima iterazione, i valori mancanti sono sostituiti da none).
foreach [ a b ] [ 1 2 3 "a" "b" ] [
    print [ a b ]
]
Risultato:
1 2
3 a
b none
(Nota: se si usano più parole in parola-o-blocco non è obbligatorio mantenere lo stesso tipo di valore)
(Nota: foreach ritorna l'ultimo valore del blocco, a meno che non si usi break/return)

forever e break [Indice di questa lezione]

forever valuta il blocco all'infinito a meno che non si usi break per interromperlo e continuare l'esecuzione dello script dalla parola che segue la parentesi quadra che chiude il blocco.
break interrompe solo il ciclo a cui appartiene il blocco, quindi gli eventuali cicli esterni non si interrompono.
forever [
    if confirm/with "Uscire? (s/N) " "s" [
        break
    ]
]
print "fine"
(Nota: è possibile ritornare un valore interrompendo qualsiasi ciclo tramite break/return valore)

Risultato:
Uscire? (s/N) a
Uscire? (s/N) b
Uscire? (s/N) s
fine

forskip parola-serie salta blocco [Indice di questa lezione]

Il funzionamento di forskip è simile a quello di forall con la differenza che salta il numero specificato di elementi del blocco.
giorni: [ lunedì martedì mercoledì giovedì venerdì sabato domenica ]
forskip giorni 3 [
    print first giorni
]
Risultato:
lunedì
giovedì
domenica
== false
(Nota: il valore ritornato da forskip è sempre false, a meno che non si usi break/return)

loop numero blocco [Indice di questa lezione]

Valuta il blocco il numero specificato di volte.
loop 3 [
    print "Ciao!"
]
(Nota: loop ritorna l'ultimo valore del blocco, a meno che non si usi break/return)

Risultato:
Ciao!
Ciao!
Ciao!

repeat parola numero-o-serie blocco [Indice di questa lezione]

Valuta il blocco per il numero di volte specificato o tante volte quanti sono gli elementi della serie; nel caso di un numero, parola assume i valori da 1 al numero, mentre nel caso di una serie, ogni volta parola assume l'ennesimo valore della serie.

(esempio con un numero)
repeat i 3 [
    print i
]
Risultato:
1
2
3
(esempio con una serie)
repeat i [ bianco rosso verde ] [
    print i
]
Risultato:
bianco
rosso
verde

until blocco [Indice di questa lezione]

Valuta il blocco e se il suo valore è false lo valuta di nuovo.
until [
    print "Ciclo"
    confirm/with "Uscire? (s/N) " "s"
]
Risultato:
Ciclo
Uscire? (s/N)
Ciclo
Uscire? (s/N) s
== true
(Nota: il valore ritornato da until è sempre true, a meno che non si usi break/return)

while condizione blocco [Indice di questa lezione]

Se condizione è vera valuta il ciclo e smette di valutarlo quando condizione diventa falsa.
while [ not confirm/with "Uscire? (s/N) " "s" ] [
    print "Ciclo"
]
Risultato:
Uscire? (s/N)
Ciclo
Uscire? (s/N) s
== false
(Nota: il valore ritornato da while è sempre false, a meno che non si usi break/return)

Parole attinenti ai cicli [Indice di questa lezione]

break Interrompe un ciclo (torna al ciclo esterno, se esiste)
for parola inizio fine salta blocco Valuta il blocco assegnano a parola i valori da inizio a fine aggiungendo ogni volta salta
forall parola-serie blocco Valuta il blocco tante volte quanti sono i valori di parola-serie, ogni ; alla fine del ciclo parola-serie è alla fine della serie
foreach parola-o-blocco serie blocco Valuta il blocco assegnando alla parola ogni valore della serie; se invece di una singola parola si fornisce un blocco di parole ogni parola è assegnata al successivo valore nella serie
forskip parola-serie salta blocco Valuta il blocco saltando alcuni elementi della serie (equivale a forall se salta vale 1)
forever blocco Valuta il blocco un numero infinito di volte
loop numero blocco Valuta il blocco il numero di volte specificato da numero
repeat parola numero-o-serie blocco Valuta il blocco il numero di volte specificato da numero assegnando alla parola, a turno, i numeri interi da 1 al numero, oppure assegnando alla parola, a turno, ciascun valore della serie
until blocco Valuta il blocco fino a che il valore del blocco non diventa true
while condizione blocco Valuta la condizione (contenuta in un blocco) e se è vera valuta il blocco seguente e continua a valutarlo fino a che la condizione non diventa false


Per commenti su questa pagina o se vuoi collaborare scrivi a Daniele Forsi