progetto JavaTurtle: sintassi
Sintassi del linguaggio 

Torna all' introduzione

Descrizione del linguaggio

Elenco delle funzioni

Un programma in JavaTurtle è composto da tre blocchi principali:

  1. Dichiarazione delle variabili globali
  2. Dichiarazione delle funzioni definite dall'utente
  3. Blocco principale (Main program)
a loro volta il secondo e terzo blocco sono composti da due parti:
  1. Dichiarazione delle variabili locali (alla funzione o al Main program)
  2. Istruzioni della funzione (o del main program)
Ogni token (parola chiave, funzione, variabile, costante ecc.) e' separato dal successivo da uno o piu' spazi, da tabulazioni oppure da uno o piu' newline. In pratica l'intero programma puo' stare su una sola riga cosi' come si puo' andare a capo ad ogni token: la liberta' e' quindi massima.

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.
I parametri passati per valore possono essere valori costanti, variabili oppure espressioni: ad esempio la funzione avanti <passi> dove <passi> indica il numero di passi da far effettuare alla tartaruga, si puo' chiamare come:

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