Manuale di Gretl: Gnu Regression, Econometrics and Time-series Library
Indietro | Capitolo 10. Costrutti loop | Avanti

# Varianti di controllo del loop

## Loop limitati

Il modo più semplice di controllare un loop consiste nello specificare direttamente il numero di volte che il ciclo deve essere ripetuto, in un cosiddetto "loop limitato". Il numero di ripetizioni può essere una costante numerica, ad esempio `loop 1000`, o può essere letto da una variabile, come in `loop volte`.

Se il numero di ripetizioni è indicato da una variabile, ad es. `volte`, la variabile dovrebbe essere uno scalare intero: se si usa una serie, viene letto il primo valore, e se questo non è intero, viene troncata la sua parte decimale. Si noti che `volte` viene valutata solo una volta, quando il loop viene impostato.

## Loop di tipo "while"

Un secondo tipo di espressione di controllo consiste nell'uso del comando `while` seguito da una disuguaglianza, in cui il termine a sinistra è il nome di una variabile predefinita, mentre il lato destro può essere una costante numerica o il nome di un'altra variabile predefinita. Ad esempio:

`loop while differ > .00001`

L'esecuzione del ciclo di comandi continuerà fintanto che la condizione specificata rimane vera. Se il termine a destra della disuguaglianza è una variabile, essa viene valutata all'inizio di ogni nuova iterazione del ciclo.

## Loop con indice

Un terzo tipo di controllo di un loop utilizza la speciale variabile indice `i`. In questo caso, vengono specificati valori iniziali e finali per `i`, che viene incrementata di uno ogni volta che viene eseguito il ciclo. La sintassi è la seguente: `loop i=1..20`.

La variabile indice può essere usata all'interno del corpo del loop, in uno dei modi seguenti: è possibile accedere al valore di `i` (si veda l'Esempio 10-4), oppure è possibile usare la sua rappresentazione come stringa `$i` (si veda l'Esempio 10-5).

I valori iniziale e finale per l'indice possono essere indicati in forma numerica, o come riferimento a variabili predefinite. Nell'ultimo caso, le variabili vengono valutate una volta, quando il loop viene impostato. Inoltre, con dataset di serie storiche è possibile indicare i valori iniziale e finale sotto forma di date, ad esempio: `loop i=1950:1..1999:4`.

## Loop di tipo "for each"

Anche il terzo tipo di controllo usa la variabile interna `i`, che in questo caso può assumere valori solo all'interno di una lista specifica di stringhe. Il loop è eseguito una volta per ogni stringa presente nella lista, agevolando l'esecuzione di operazioni ripetitive su un gruppo di variabili. Ecco un esempio:

            loop foreach i mele pere pesche
              print "$i"
            endloop

Questo loop verrà eseguito tre volte, mostrando "mele", "pere" e "pesche" ad ogni iterazione.

Per eseguire un loop su una lista di variabili contigue nel dataset, è possibile indicare i nomi della prima e dell'ultima variabile nella lista, separate da "`..`", invece di dover indicare tutti i nomi. Ad esempio, ipotizzando di avere 50 variabili `AK`, `AL`, …, `WY`, che contengono livelli di reddito per gli stati degli USA, per stimare una regressione del reddito sul tempo per ognuno degli stati, basta eseguire:

           genr time
           loop foreach i AL..WY
              ols $i const time
           endloop

## Loop di tipo "for"

L'ultimo tipo di controllo usa una forma semplificata dell'istruzione `for` del linguaggio di programmazione C. L'espressione di controllo si compone di tre parti, separate da punto e virgola. La prima parte specifica una condizione iniziale, espressa per mezzo di una variabile di controllo; la seconda parte imposta una condizione di continuazione (espressa in funzione della stessa variabile di controllo), mentre la terza parte specifica un incremento (o un decremento) per la variabile di controllo, da applicare ogni volta che il ciclo viene eseguito. L'intera espressione deve essere racchiusa tra parentesi. Ad esempio:

`loop for (r=0.01; r<.991; r+=.01)`

La variable `r` assumerà i valori 0.01, 0.02, …, 0.99 nel giro di 99 iterazioni. Si noti che a causa della precisione limitata dell'aritmetica in virgola mobile usata dal computer, può dover essere necessario usare una condizione di continuazione come quella mostrata sopra, `r<.991`, invece della più "naturale" `r<=.99` (usando numeri in doppia precisione su un processore x86, quando ci si aspetta che `r` valga 0.99, potrebbe in realtà valere 0.990000000000001).

Altre regole per i tre componenti dell'espressione di controllo: (1) la condizione iniziale deve avere forma X1 = Y1, dove Y1 deve essere una costante numerica o una variabile predefinita. Se la variabile X1 non esiste, viene creata automaticamente. (2) La condizione di continuazione deve avere la forma X1 `operatore` Y2, dove l'`operatore` può essere `<`, `>`, `<=` o `>=` e Y2 deve essere una costante numerica o una variabile predefinita (nel caso in cui sia una variabile, essa viene valutata ad ogni esecuzione del ciclo). (3) L'espressione che indica l'incremento o il decremento deve avere la forma X1 += DELTA, oppre X1 -= DELTA, dove DELTA è una costante numerica o una variabile predefinita (nel secondo caso, essa viene valutata solo una volta, quando il loop viene impostato).

Indietro | Partenza | Avanti
Costrutti loop | Risali | La modalità "progressiva"