Home / Indice sezione
 www.icosaedro.it 

M2 Report

<= Istruzione di assegnamentoOrdine di valutazione degli argomenti attuali =>
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
 

Istruzione per la chiamata di funzione

Le funzioni che non hanno un valore di ritorno sono dette procedure. Le procedure si possono richiamare in una istruzione di chiamata di funzione. Esempio:

DeleteRecord(db, table_name, rec_number)

Questa è la forma prefissa, dove cioè il nome della funzione precede gli argomenti. E' possibile anche la forma postfissa, dove il primo argomento della funzione precede il nome della funzione stessa:

db->DeleteRecord(table_name, rec_number)

La forma postfissa si può usare solo quando il primo argomento attuale della chiamata di funzione è una variabile, oppure una variabile alla quale sono applicati gli operatori di dereferenziazione (selezione di elemento di ARRAY, selezione di campo di RECORD, sottostringa). La forma postfissa non è possibile quando il primo argomento è una espressione più generale.

Consideriamo un caso più articolato, dove la procedura Translate prende 3 argomenti, e confrontiamo le due forma di chiamata:

MODULE PrePostExample

TYPE Point = RECORD x, y: REAL END

FUNCTION Translate(VAR p: Point, dx: REAL, dy: REAL)
BEGIN
    p[x] = p[x] + dx
    p[y] = p[y] + dy
END

VAR
    p: Point
    polygon: ARRAY OF POINT

BEGIN
    Translate(p, 0.0, 1.0)  # prefix notation
    p->Translate(0.0, 1.0)  # postfix notation

    (* We set the first point of the polygont at (2.0,3.0)
       using the prefix notation: *)
    Translate(p[0], 2.0, 3.0)

    (* Now we set the second point of the polygon at (5.0, 7.0)
       using the equivalent postfix notation: *)
    polygon[1]->Translate(5.0, 7.0)
END

La due forme sintattiche prefissa e postfissa sono semanticamente equivalenti. Come vedremo nella trattazione dei tipi strutturati, la variabile p all'inizio del programma vale NIL e viene istanziata non appena la funzione Translate assegna uno dei suoi campi.

Per le funzioni che ritornano un valore, le notazioni prefissa e postfissa si possono usare anche nelle espressioni, ma con una restrizione: il primo argomento della funzione deve essere passato per valore.

Il nome della funzione può essere qualificato in entrambe le forme prefissa e postfissa. La notazione postfissa offre un piccolo vantaggio rispetto al problema delle collisioni nello spazio dei nomi delle funzioni: se il nome della funzione non è qualificato, la funzione richiesta viene ricercata tra le funzioni esportate dal modulo nel quale è definito il tipo della variabile prefissa. Nell'esempio precedente, poiché la variabile p e gli elementi dell'array polygon sono di tipo Point, e siccome il tipo Point è definito nel modulo PrePost, il nome della funzione Translate identifica univocamente la funzione del nostro modulo.

 
<= Istruzione di assegnamentoOrdine di valutazione degli argomenti attuali =>

Umberto Salsi

Contatto
Mappa
Home / Indice sezione