Dichiarare ed utilizzare una funzione, routine o come la si vuole chiamare, spesso e volentieri ci aiuta molto nel suddividere un determinato algoritmo in parti più piccole che, prese singolarmente, sono più semplici da implementare. Una funzione è un blocco di codice che effettua determinate operazioni e che può avere opzionalmente degli argomenti (l'input della funzione) e può restituire (sempre opzionalmente) un valore in output.
In hybris la sintassi per dichiarare una funzione è la seguente :
function /* nome della funzione */ ( /* eventuali argomenti */ ){ /* corpo della funzione */ }
Ad esempio, se volessimo implementare una funzione che effettua la somma tra due numeri e ne restituisce il risultato :
function somma( a, b ){ return a + b; } numero_1 = 10; numero_2 = 124; somma = somma( numero_1, numero_2 ); println( numero_1 + " + " + numero_2 + " = " + somma );
Un discorso particolare va fatto inoltre sulla visibilità delle variabili ovvero, come accedere a variabili dichiarate fuori dal corpo di una funzione dall’interno di essa.
Hybris segue una logica secondo la quale le varibili dichiarate nel corpo principale dello script sono globali, un po come avviene nel javascript, c, c++, ecc, ovvero saranno visibili anche dall’interno di funzioni dichiarate successivamente la variabile.
Questo significa che, se abbiamo la necessità di sfruttare una variabile esterna dall’interno di una funzione, dobbiamo dichiararla all'esterno della funzione stessa in modo tale che, nel momento in cui la funzione viene richiamata, sarà la dichiarazione della variabile nella memoria virtuale di hybris.
Vediamo l’esempio precedente con una piccola modifica :
function somma(){ return numero_1 + numero_2; } numero_1 = 10; numero_2 = 124; somma = somma(); println( numero_1 + " + " + numero_2 + " = " + somma );
In questo caso, invece di utilizzare degli argomenti in ingresso, la funzione sfrutta le due variabili dichiarate all'esterno del suo corpo, quindi globalmente.
Nei vari esempi che abbiamo visto, gli argomenti delle funzioni vengono passati per copia, ovvero viene creata una copia a runtime di ogni argomento in modo tale che qualsiasi modifica la variabile che contraddistingue l'argomento subisca all'interno della funzione, questa non si ripercuota anche sulla variabile originale, ad esempio :
function esegui_modifica( s ){ /* * 's' è una copia di 'str', quindi questa modifica non si * ripercuoterà anche su 'str' ma solo su 's' */ s = "nuova stringa"; } str = "ciao"; // passaggio per copia esegui_modifica( str ); println( str );
Stamperà sulla console :
ciao
poichè, come indicato nel commento del codice, 's' rappresenta una copia di 'str' creata appositamente prima dell'esecuzione della funzione.
Se invece desideriamo che uno o più argomenti di una funzione siano modificabili dall'interno della funzione stessa, dobbiamo passarglieli per riferimento, ovvero, tramite l'operatore &, creare un riferimento alla variabile che, quando sarà aggiornato, aggiornerà anche la variabile referenziata.
Modificando il precedente esempio :
function esegui_modifica( s ){ /* * 's' questa volta è un riferimento di 'str' e quindi ogni modifica * che subisce, ripercuoterà anche su 'str' */ s = "nuova stringa"; } str = "ciao"; // passaggio per riferimento esegui_modifica( &str ); println( str );
Questa volta il codice stamperà :
nuova stringa
proprio grazie a questo espediente.
Nel caso in cui volessimo definire una funzione 1) che non richiede un numero definito di argomenti, ma ne può accettare un qualsiasi numero decida l'utente, la si può definire nel seguente modo :
function foo( ... ){ }
In questo caso, per accedere agli argomenti, si deve usare l'operatore @ nel seguente modo :
function foo( ... ){ foreach( argomento of @ ){ println( argomento ); } } foo( 1, 0.2, "bar", "moo" );
Che stamperà :
1 0.200000 bar moo
Se volessimo definire una funzione che, pretende almeno un parametro, ma ne può accettare anche più di uno opzionalmente, scriveremo :
function foo( primo, ... ){ }
E così via, purchè la direttiva … si trovi sempre alla fine della lista degli argomenti .