- In ordine alfabetico
- Sintassi di base | Comandi | Funzioni | Cicli | Selezioni | Espressioni logiche | Sottoprogrammi
In ordine alfabetico
and | Operatore logico |
backward(…) | |
break | Interruzione della ripetizione |
coinFlip() | |
east(…) | EST |
eatUp() | Mangia il faro |
end | Interruzione del programma |
false | Costante logica |
forward(…) | |
frontIsBeacon() | ? |
frontIsBlack() | ? |
frontIsClear() | ? |
frontIsObstacle() | ? |
frontIsWhite() | ? |
goto(…,…) | Porta il robot alla posizione specificata |
if(…) {…} | Selezione singola |
if(…) {…} else {…} | Selezione doppia |
left() | |
leftIsBeacon() | ? |
leftIsBlack() | ? |
leftIsClear() | ? |
leftIsObstacle() | ? |
leftIsWhite() | ? |
north(…) | NORD |
not | Operatore logico |
paintBlack() | |
paintWhite() | |
pickUp() | |
procedure … (…) {…} | |
putDown() | |
repeat(…) {…} | Ripetizione |
repeatWhile(…) {…} | Ripetizione condizionata |
return | Interruzione della procedura |
right() | |
rightIsBlack() | ? |
rightIsClear() | ? |
rightIsObstacle() | ? |
rightIsBeacon() | ? |
rightIsWhite() | ? |
stopPainting() | |
south(…) | SUD |
west(…) | OVEST |
Sintassi di base
Le parole riservate del linguaggio sono
In caso di amnesia, tramite la voce di menu Edit > Insert... > ... è possibile inserire una qualsiasi delle parole chiave.
Dalla versione 3.0 le parentesi sono facoltative per i comandi senza parametri
1 2 |
rightIsClear() rightIsClear |
I file sorgente sono file di testo con alcune particolarità
- L’estensione è .irobo (nelle prime versioni l’estensione era .robo)
- I file si trovano nella cartella …scripts/en (quelli in inglese…)
Il testo dopo il segno # sarà trattato come un commento cioè verrà saltato dall’interprete del linguaggio
1 |
# questo è un commento |
Se un programma viene scritto per una specifica mappa allora questa può essere caricata automaticamente tramite una direttiva nel file sorgente:
1 |
# map: nomemappa.map |
Comandi
Il robot esegue degli ordini con nomi prefissati.
Alcuni ordini prevedono un parametro n, numero di passi
Movimento | left | Gira a sinistra/destra di 90 gradi (rispetto alla direzione attuale) |
|
---|---|---|---|
right | |||
forward(n) | Fai n passi avanti/indietro | ||
backward(n) | |||
north(n) | Gira verso nord/sud/est/ovest e fai n passi in avanti (qualunque sia la direzione attuale) |
||
south(n) | |||
east(n) | |||
west(n) | |||
goto(col, riga) | Porta il robot alla posizione specificata, senza sbattere… | ||
Disegno | paintWhite | Appoggia il pennello bianco/nero sul pavimento e comincia a scrivere | |
paintBlack | |||
stopPainting | Alza il pennello e smetti di scrivere | ||
Azioni | pickUp | Raccogli Rilascia Mangia il faro |
|
putDown | |||
eatUp |
Funzioni
Il robot prende delle decisioni… dopo aver valutato i valori restituiti da certe funzioni che lo informano sul mondo che lo circonda.
Per esempio: frontIsClear, di fronte la strada è libera?
A sinistra | Di fronte | A destra | CONTROLLO? | |
leftIsClear | frontIsClear | rightIsClear | Strada libera? Quante celle? |
|
---|---|---|---|---|
leftIsBeacon | frontIsBeacon | rightIsBeacon | Un faro? | |
leftIsBlack | frontIsBlack | rightIsBlack | Colore nero (scuro)? Quante celle? |
|
leftIsWhite | frontIsWhite | rightIsWhite | Colore bianco (chiaro)? Quante celle? |
|
leftIsObstacle | frontIsObstacle | rightIsObstacle | Ostacolo? |
Casualità
Lancia una moneta, flipCoin, e restituisce il risultato.
Il risultato di flipCoin sarà true/false con la stessa probabilità.
Si utilizza per prendere una decisione casuale.
Cicli
Una sequenza di istruzioni, delimitata da parentesi graffe, può essere eseguita più volte tramite le seguenti strutture di controllo
repeat(n) { … }
Ripeti n volte le istruzioni delimitate dalle parentesi graffe.
Esempio
1 2 3 4 5 |
repeat(4) # per 4 volte { forward(2) # vai avanti di 2 passi right # gira a destra } |
Disegna un quadrato…
repeat { … }
Ripeti per sempre le istruzioni delimitate dalle parentesi graffe.
Esempio
Vai avanti per sempre
1 2 3 4 |
repeat { forward(1) } |
Ma se incontra un ostacolo si ferma…
repeatWhile(…) { … }
Ripeti le istruzioni delimitate dalle parentesi graffe finchè la condizione è vera.
La condizione sarà, per esempio, la chiamata di una delle funzioni che osservano.
Esempio
1 2 3 4 |
repeatWhile(frontIsClear) # finché davanti è libero { forward(1) # fai un passo } |
break
All’interno di un’istruzione repeat(), permette di interrompere l’esecuzione della sequenza.
L’esecuzione riprende con la prima istruzione dopo la parentesi graffa di chiusura del ciclo.
Esempio
1 2 3 4 5 6 7 8 9 10 11 |
repeat # ripeti per sempre { if(frontIsObstacle) # se davanti c'è un ostacolo { break # interrompi } else # altrimenti { forward(1) # fai un passo } } |
end
Provoca l’interruzione dell’esecuzione del programma.
Esempio
1 2 3 4 5 6 7 8 |
repeat() # ripeti per sempre { forward(1) # fai un passo if(rightIsBeacon) # se a destra c'è il faro { end # smetti } } |
Selezioni
Una sequenza di istruzioni, delimitata da parentesi graffe, può essere eseguita o meno tramite le seguenti strutture di controllo
if(…) { … }
Esegui le istruzioni delimitate dalle parentesi graffe se la condizione nelle parentesi tonde è vera.
Esempio
1 2 3 4 5 6 7 8 9 |
if(leftIsWhite) # se a sinistra è bianco { left # vai a scirvere... paintBlack forward(1) stopPainting backward(1) right } |
if(…) { … } else { … }
Esegui le istruzioni delimitate dalle parentesi graffe dopo l’if() se la condizione è vera altrimenti esegui le istruzioni delimitate dalle parentesi graffe dopo l’else.
Esempio
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if(leftIsWhite) # se a sinista è bianco { left # vai a scrivere forward(1) paintBlack stopPainting backward(1) right } else # altrimenti { forward(3) # vai avanti } |
Espressioni logiche
Le condizioni nelle istruzioni if() e repeatWhile() sono dette espressioni logiche.
Queste espressioni possono essere vere o false e permettono all’esecutore di decidere qual è la prossima istruzione da eseguire.
Esempio
1 2 3 4 5 |
if(leftIsWhite) # se a sinistra è bianco { left # girati a sinistra forward(1) # fai un passo } |
Anche i confronti tra numeri restituiscono un valore vero o falso
- <, minore di
- <=, minore di oppure uguale a
- >, maggiore di
- >=, maggiore di oppure uguale a
- ==, uguale a
- ~=, non uguale a, diverso da
Esempio
1 2 3 4 5 |
if(passi <= 5) # se il valore della variabile passi è minore oppure uguale a 5 { left # girati a sinistra forward(1) # fai un passo } |
Un’espressione logica può essere una singola funzione di osservazione, un singolo confronto oppure può essere costituita da più funzioni/confronti combinati con gli operatori not, and, or.
In questo modo si rende più ponderata la decisione di eseguire o meno un blocco di istruzioni.
not, ~
Nega il valore dell’argomento.
Esempio
Davanti non è libero
1 |
not frontIsClear |
and, &
Vero se entrambi gli argomenti sono veri.
Esempio
Davanti è libero e a destra è bianco
1 |
frontIsClear and rightIsWhite |
or, |
Vero se almeno uno degli argomenti è vero.
Esempio
Davanti è libero oppure a destra è bianco
1 |
frontIsClear or rightIsWhite |
true, false
I valori true e false possono essere usati direttamente nelle espressioni.
Ordine di valutazione
not => and => or
Le parentesi possono alterare l’ordine di valutazione.
Esempio
Ripeti mentre davanti non è libero e inoltre è bianco a sinistra oppure a destra, vai avanti di un passo
1 2 3 4 |
repeatWhile(not frontIsClear and (leftIsWhite or rightIsWhite)) { forward(1) } |
1 2 3 4 5 |
if(flipCoin() and not rightIsWhite()) { right() backward(1) } |
1 2 3 4 |
if(true and false) { forward(1) } |
Sottoprogrammi
I sottoprogrammi si utilizzano quando
- una certa sequenza di istruzioni appare più volte nello stesso programma: la scrivo una sola volta e la chiamo per nome più volte
- appare in programmi diversi: la progetto una volta e poi la utilizzo con copia e incolla in altri programmi
- per semplificare il codice: suddivido il codice in blocchi logici e li progetto uno alla volta
Il codice del sottoprogramma non viene eseguito automaticamente ma ogni volta che comparirà la sua chiamata.
procedure nome { … }
Definisce un sottoprogramma con un nome a piacere.
La chiamata avviene scrivendo semplicemente il nome dove serve.
Esempio
Come disegnare un rettangolo 3×2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
rettangolo procedure rettangolo { paintWhite repeat(2) { forward(2) right forward(3) right } stopPainting } |
procedure nome(p1, p2, …) { … }
Definisce un sottoprogramma con un nome a piacere.
Il sottoprogramma può avere un certo numero di parametri. Saranno utilizzati come variabili nel blocco successivo di istruzioni.
Si consiglia di utilizzare nomi significativi per i parametri.
Esempio
Come disegnare un rettangolo, date le dimensioni orizzontale e verticale
1 2 3 4 5 6 7 8 9 10 11 12 |
procedure rettangolo(base, altezza) { paintWhite repeat(2) { forward(altezza) right forward(base) right } stopPainting } |
nome(a1, a2, …)
La chiamata di un sottoprogramma avviene scrivendo il nome seguito dall’elenco degli argomenti, cioè con i particolari valori che saranno utilizzati dal sottoprogramma.
Il numero di argomenti deve corrispondere al numero di parametri dichiarati nella definizione del sottoprogramma.
Esempio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
rettangolo(3,2) # Un rettangolo 3x2 forward(4) # Avanti di 4 passi rettangolo(1,4) # Un rettangolo 1x4 procedure rettangolo(base, altezza) # Rettangolo con parametri { paintWhite repeat(2) { forward(altezza) right forward(base) right } stopPainting } |
return
Se il sottoprogramma ha raggiunto il suo scopo allora si può decidere di ritornare al punto dove è stata fatta la chiamata e continuare con l’esecuzione delle istruzioni successive.
Si tratta di una scorciatoia che permette di progettare più facilmente una procedura complessa.
Esempio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
trovaFaro # Esegue l'operazione di ricerca del faro trovaPunto # quando ritorna esegue l'operazione di ricerca del punto bianco putDown # e quindi posa il faro procedure trovaFaro { # cerca il faro... if(frontIsBeacon) { pickUp return } # ... } |
L’istruzione di ritorno può contenere un valore che verrà restituito al chiamante, la procedura si comporta come una funzione…
1 2 3 |
... return(x) ... |
Ricorsione
Le procedure possono essere definite in funzione di se stesse…
1 |
... |