Un programma in JavaTurtle è composto da tre blocchi principali:
- Dichiarazione delle variabili globali
- Dichiarazione delle funzioni definite dall'utente
- Blocco principale (Main program)
- Dichiarazione delle variabili locali (alla funzione o al Main program)
- Istruzioni della funzione (o del main program)
Vediamo in dettaglio i blocchi principali.
Dichiarazione delle variabili (globali o locali)
La sintassi qui descritta vale sia per la dichiarazione delle variabili globali (quelle all'inizio del programma), sia per quelle dichiarate all'interno delle funzioni e del blocco principale (main).
Le variabili si dichiarano con la parola chiave variabile seguita
dal nome della variabile.
Le variabili di tipo numerico (double) hanno il nome che inizia con
il `dollaro` ($), mentre quelle di tipo stringa iniziano con la 'chiocciola'
(@).
Ad esempio la dichiarazione della variabile numerica $passo
e':
variabile $passo
opzionalmente nella dichiarazione si puo' assegnare anche un valore iniziale alla variabile: ad esempio per inizializzare $passo a 5.5 si fa:
variabile $passo 5.5
Per dichiarare invece la variabile stringa @nome inizializzandola a "Turtle" la sintassi e':
variabile $nome "Turtle"
Nel caso non sia assegnato nessun valore, la variabile viene inizializzata a zero se e' numerica, oppure a "" (stringa vuota) se e' di tipo stringa.
Nota: le costanti stringa (come "Turtle") sono contenute tra virgolette,
le quali devono essere aperte e chiuse sulla stessa riga. Non esistono
caratteri speciali (del tipo '\n' '\t' ecc. , quindi '\n' viene stampato
esattamente come '\n') e la stringa non puo' contenere i doppi apici (").
In futuro queste limitazioni verranno (spero) eliminate.
Funzioni definite dall'utente
La parola chiave per dichiarare una funzione e' (incredibile a dirsi) funzione. Dopo funzione segue il nome della stessa, e i parametri che, se presenti, si mettono all'interno di una coppia di parentesi tonde (se la funzione non ha parametri, le parentesi si possono evitare). Ad esempio per dichiarare la funzione fai_tutto con parametri $a e $b si scrive
funzione fai_tutto ($a $b)
a questo punto si mettono le variabili
locali alla funzione, come descritto nel paragrafo precedente, poi il corpo
della funzione, che finisce quando si incontra la parola chiave fine_funzione.
I parametri e le variabili locali possono essere sia di tipo numerico che
stringa.
Esempio:
funzione fai_tutto ($a $b)
Variabile $l1
Variabile $l2 0
(... corpo della funzione ...)
fine_funzione
Nella sezione "Sequenza di istruzioni"
vedremo come costruire il corpo della funzione.
Nel corpo della funzione (e solo li') si puo' usare la parola chiave
'ritorna' seguita da una costante, variabile o espressione (vedi
dopo). Se durante l'esecuzione della funzione viene incontrata questa istruzione,
si ha la fine dell'esecuzione della funzione, e il valore di ritorno sara'
quello indicato come parametro di 'ritorna'.
Per ora le funzioni definite dall'utente possono ritornare solo valori
numerici (non stringa).
Nel caso l'esecuzione della funzione termini senza incontrare l'istruzione
'ritorna', il valore ritornato di default e' zero.
Blocco principale
Dopo la dichiarazione dell'ultima funzione inizia il blocco principale (non si possono quindi dichiarare funzioni dopo il blocco principale), che e' la prima parte di programma che viene eseguita (come main del C). Il suo inizio si indica con la parola chiave blocco_principale. Le variabili dichiarate dopo questa parola chiave sono locali al main e non sono visibili dalle funzioni. Finite le dichiarazioni delle variabili inizia il corpo del main, che continua fino alla fine del file: non esiste quindi una parola chiave per definire la fine del main.
Un esempio di scheletro di programma e' quindi
; (i commenti sono preceduti dal punto e virgola)
; *** variabili globali ***
variabile $g1
variabile $g2 2 ; $g2 e' inizializzata a 2
(...)
variabile $gn
; *** funzioni definite dall'utente ***
funzione fai_tutto ($a $b)
; variabili locali alla funzione
Variabile $l1
Variabile $l2 $a ; $l2 e' inizializzato al valore
del parametro $a
(... corpo della funzione ...)
fine_funzione
funzione XXX
(...)
funzione YYY
; *** main program ***
blocco_principale
; variabili locali al main
variabile $lm1
(...) ; istruzioni del main
Sequenza di istruzioni
Il corpo delle funzioni e del blocco principale e' composto da una sequenza di istruzioni (che possono essere sia predefinite o dichiarate dall'utente), e di istruzioni di selezione e iterazione, che saranno descritte in seguito. Cominciamo con le sequenze di istruzioni:
Vediamo un esempio di sequenza:
Assegna $g1 100
Incrementa $g1
Stampa $g1
queste istruzioni assegnano il valore 100 alla variabile $g1, incrementano il valore di questa variabile di un'unita' e lo stampano sullo standard output (verra' qunidi stampato 101).
L'elenco delle funzioni predefinite con la loro sintassi si trova qui.
Possiamo notare che:
- Le funzioni (sia predefinite che definite dall'utente) si chiamano indicando il loro nome seguito dagli eventuali parametri.
- Non esiste nessun simbolo per indicare la fine di un'istruzione (come il ; del C), in quanto la semplicita' del linguaggio fa si' che non sia necessario.
- A differenza delle funzioni definite dall'utente, in quelle predefinite esiste il passaggio per indirizzo, usato ad esempio nell'istruzione incrementa, che va a modificare il valore della variabile passata come parametro.
avanti 10 ; avanti di 10 passi
avanti $a ; avanti di un numero di passi pari al valore della variabile
$a
avanti { somma 3 2 } ; avanti di 3+2 = 5 passi
nel terzo caso vediamo un esempio di espressione: il parametro della funzione avanti e' il risultato della chiamata della funzione somma, la quale ritorna la somma tra i suoi due parametri. In generale una espressione e' una istruzione racchiusa tra parentesi graffe il cui valore di ritorno verra' usato come parametro per la funzione del blocco piu' esterno. Le espressioni si possono nidificare, ad esempio
avanti { prodotto 2 { somma $a $b } }
o piu' semplicemente
avanti { * 2 { + $a $b } }
fa avanzare la tartaruga di un numero di passi pari a 2*($a+$b)
Vediamo ora l'istruzione che permette di cambiare il flusso di esecuzione
del programma:
Selezione
La selezione permette di far eseguire una parte di programma solo se si verifica una determinata condizione. Si ottiene in questo modo:
se <valore>
(...) ; istruzioni nel caso <valore> sia diverso da zero
fine_se
Oppure
se <valore>
(...) ; istruzioni nel caso <valore> sia diverso da zero
altrimenti
(...) ; istruzioni nel caso <valore> sia zero
fine_se
<valore> puo' essere una costante (non molto utile...), una variabile o un'espressione. Se <valore> sara' diverso da zero la condizione sara' verificata e le istruzioni saranno eseguite. Al contrario se <valore> sara' zero, si eseguira' la parte dopo altrimenti, se presente.
esempio:
se { maggiore $a $b }
avanti { - $a $b } ; va avanti di $a-$b passi
altrimenti
avanti { - $b $a } ; va avanti di $b-$a passi
fine_se
Per ripetere piu' volte una sequenza di istruzioni si usano le strutture
di iterazione (anche dette cicli):
Iterazione
I cicli si possono fare in due modi, uno piu' semplice e l'altro piu' flessibile.
Cominciamo dal primo: la sintassi e':
ripeti <valore> volte
(...) ; istruzioni del ciclo
fine_ripeti
esempi:
; disegna un quadrato
ripeti 4 volte
avanti 100
destra 90 ; ruota di 90 gradi verso destra
fine_ripeti
; disegna una linea multicolore lunga $num pixel
ripeti $num volte
avanti 1
nuovo_colore
fine_ripeti
il secondo tipo di ciclo e' piu' flessibile. La sintassi e'
mentre <valore>
(...)
fine_mentre
Vediamo un esempio:
; disegna un esagono di lato 50
assegna $angolo 0
mentre { minore $angolo 360 }
avanti 50
direzione $angolo
incrementa_di $angolo 60
fine_mentre

