Home / Indice sezione
 www.icosaedro.it 

M2 Report

<= Sezione VARSezione BEGIN =>
Frontespizio
Introduzione
Caratteristiche
Un semplice esempio
Moduli
Sezione IMPORT
Sezione CONST
Sezione TYPE
Tipo FORWARD
Sezione VAR
Sezione FUNCTION
Sezione BEGIN
Stringhe letterali
Sottostringhe
Commenti
Costanti predefinite
Variabili predefinite
Funzioni predefinite
Istruzione di assegnamento
Istruzione per la chiamata di funzione
Ordine di valutazione degli argomenti attuali
Istruzione IF
Istruzione SWITCH
Istruzione FOR
Istruzione WHILE
Istruzione REPEAT
Istruzione LOOP
Istruzione TRY
Istruzione RAISE ERROR
Istruzione RETURN
Espressioni logiche
Espressioni intere
Espressioni reali
Espressioni stringa
Espressioni tra tipi strutturati
Regole di scope
M2 per programmatori C
M2 per programmatori Java
Rappresentazione dei dati in memoria
Keywords
Messaggi di errore a runtime
Sintassi
 

Sezione FUNCTION

La dichiarazione della funzione permette di dichiarare il nome della funzione, i suoi argomenti e il tipo del valore ritornato. Nei DEFINITION MODULE questo completa la funzione. Le parentesi tonde delimitano l'elenco degli argomenti, e devono essere presenti anche se la funzione non prevede argomenti. Se la funzione ritorna un valore, il suo tipo deve essere specificato. Le funzioni che non ritornano un valore sono più propriamente dette procedure.

Negli IMPLEMENTATION MODULE e nei MODULE alla dichiarazione della funzione deve seguire il corpo, costituito dalle sezioni CONST, TYPE, VAR e FUNCTION. Le costanti, i tipi, le variabili e le funzioni dichiarati all'interno della funzione sono accessibili solo dalla funzione stessa. Le variabili esistono e vengono inizializzate al loro valore default ogni volta che la funzione viene richiamata.

In questo esempio di funzione gli argomenti sono il nome e il cognome di un membro del personale, e il valore di ritorno è un dato di tipo Persona. Se il dato non viene trovato, la funzione potrebbe ritornare il valore NIL.

FUNCTION CercaPersona(nome: STRING, cognome: STRING): Persona
    (* eventuali sezioni CONST, TYPE, VAR, FUNCTION *)
BEGIN
    (* istruzioni *)
END

La funzione può disporre delle proprie sezioni CONST, TYPE, VAR e FUNCTION.

Gli argomenti di tipo semplice BOOLEAN, INTEGER, REAL sono passati per valore. All'interno della funzione si possono modificare gli argomenti passati per valore, ma l'assegnamento influenza solo la copia locale del dato. E' possibile anteporre il modificatore VAR al nome dell'argomento formale: in questo caso l'argomento attuale deve essere una variabile ed esso viene passato alla funzione per indirizzo.

Gli argomenti di tipo dinamico STRING, ARRAY, RECORD e FUNCTION sono passati per indirizzo al valore del dato. Un assegnamento su di un argomento formale passato per valore crea una nuova stringa locale alla funzione, o un nuovo array o un nuovo record, ma non modifica il dato originario. Se il nome dell'argomento è preceduto dal modificatore VAR, allora l'argomento attuale della chiamata della funzione deve essere una variabile (o elemento di array, o campo di record) e l'argomento formale diventa il riferimento a questa variabile: eventuali assegnamenti eseguiti sull'argomento formale modificano la variabile attuale.

Attenzione!Se l'argomento formale della funzione è un ARRAY o un RECORD passati per valore, allora la funzione ha accesso agli elementi dell'array e ai campi del record e può eseguire assegnamenti su di essi anche se l'argomento formale è passato per valore.

I seguenti esempi illustrano i vari casi:

FUNCTION f1(b: BOOLEAN, i: INTEGER, r: REAL)
L'argomento è una copia del valore. Eventuali assegnamenti eseguiti all'interno della funzione modificano solo la copia del dato e non il dato originario. E' possibile pensare agli argomenti passati per valore come a variabili locali della funzione il cui valore viene impostato dal chiamante. L'argomento attuale può essere sia una variabile, sia una espressione.

FUNCTION f2(s: STRING)
L'argomento è una copia dell'indirizzo della stringa, e non la stringa stessa, per ragioni di efficienza. Tuttavia, eventuali assegnamenti all'interno della funzione causano la creazione di una nuova stringa, mentre l'argomento attuale non viene modificato. In definitiva possiamo considerare le stringhe come argomenti passati per valore esattamente come nel caso precedente. Abbiamo discusso questo caso separatamente per maggior chiarezza.

FUNCTION f3(VAR b: BOOLEAN, VAR i: INTEGER, VAR r: REAL)
Gli argomenti formali con modificatore VAR sono gli indirizzi dei dati, e non i valori stessi dei dati. Gli argomenti attuali nella istruzione di chiamata di questa funzione devono essere variabili di tipo corrispondente, oppure elementi di ARRAY o campi di RECORD. Gli argomenti attuali non possono essere espressioni nè costanti, nè valori letterali. Il modificatore VAR permette alla funzione sia di leggere il valore corrente del dato, sia di modificarlo.

FUNCTION f4(VAR s: STRING)
L'argomento formale è l'indirizzo della variabile attuale di tipo STRING. L'argomento attuale deve essere una variabile di tipo STRING o un elemento di ARRAY di tipo STRING, o un campo di RECORD di tipo STRING. L'argomento attuale non può essere una espressione, nè una costante, nè un letterale stringa. La funzione può sia leggere il valore corrente della stringa, sia modificare il valore originario.

FUNCTION f5(a: ARRAY OF ..., r: RECORD ... END)
Gli argomenti di tipo ARRAY e RECORD sono l'indirizzo ai dati. Anche questa è una scelta di efficienza. Questa scelta ha diverse conseguenze importanti:

  • L'assegnamento ad un argomento di tipo dinamico passato per valore crea una nuova istanza del dato ma non modifica nè il dato originario, nè l'argomento attuale. Ad esempio, l'assegnamento
    a = NIL
    non cancella l'ARRAY, ma crea un nuovo ARRAY NIL locale alla funzione.
  • L'assegnamento agli elementi degli ARRAY e ai campi dei RECORD modifica il dato passato. Ad esempio, l'assegnamento a un elemento di un array
    a[i] = ...
    causa la modifica dell'elemento di indice i dell'ARRAY originario.

FUNCTION f6(VAR a: ARRAY OF ..., VAR r: RECORD ... END)
Gli argomenti formali sono gli indirizzi delle variabili attuali. Gli argomenti attuali devono essere variabili o elementi di ARRAY, o un campi di RECORD di tipo compatibile. La funzione può sia accedere ai valori dei dati, sia modificare i valori originari.

Nell'esempio seguente dichiariamo una funzione che aggiunge un punto a un poligono:

FUNCTION AggiungiPunto(punto: Punto, VAR poligono: Poligono)
BEGIN
    poligono[ count(poligono) ] = punto
END
Attenzione!In quest'ultimo esempio il modificatore VAR è necessario per gestire correttamente il caso in cui l'ARRAY è NIL. Senza il modificatore VAR, l'aggiunta del primo punto al poligono comporterebbe la creazione di un ARRAY locale della funzione che sarebbe distrutto all'uscita dalla funzione stessa, mentre la variabile attuale rimarrebbe immutata.
 
<= Sezione VARSezione BEGIN =>

Umberto Salsi

Contatto
Mappa
Home / Indice sezione