Home / Indice sezione
 www.icosaedro.it 

M2 Report

<= Sezione TYPESezione VAR =>
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
 

Tipo FORWARD

Il tipo speciale FORWARD ha due utilità: consente la dichiarazione di strutture dati complesse e permette di migliorare il livello di astrazione dei moduli di libreria attraverso il concetto di tipo opaco.

Strutture dati complesse

Nella sezione TYPE è ammesso dichiarare un tipo la cui struttura sarà esplicitata più avanti. In questo caso il tipo viene dichiarato FORWARD. Un esempio tipico sono le strutture dati complesse, come un B-Tree, dove un nodo è una lista di nodi:

TYPE
    Item = FORWARD

    Page = RECORD
        p0: Page
        e: ARRAY OF Item
    END

    (* Esplicitazione del tipo Item: *)
    Item = RECORD
        key: INTEGER
        p: Page
        count: INTEGER
    END

Il tipo Page viene definito in termini del tipo Item e viceversa. Si pone il problema dell'uovo e della gallina: non sarebbe possibile dichiarare l'uno se prima non si è dichiarato l'altro. Qui abbiamo scelto di dichiarare Item FORWARD, poi abbiamo dichiarato Page, e infine abbiamo esplicitato Item.

La dichiarazione FORWARD è ammessa solo per strutture dati ARRAY e RECORD. Non è possibile esplicitare un tipo FORWARD come un tipo semplice. L'esplicitazione del tipo FORWARD deve avvenire nello stesso modulo dove appare la dichiarazione FORWARD.

Tipi opachi

E' possibile dichiarare un tipo FORWARD nel DEFINITION MODULE ed esplicitarne la struttura nell'IMPLEMENTATION MODULE. In questo caso i moduli clienti non hanno accesso alla struttura interna del dato, e pertanto qui chiameremo opaco questo tipo di dato.

Equivalenza tra tipi opachi. In generale in M2 due tipi sono uguali se hanno la stessa struttura. I tipi opachi fanno eccezione: poiché la loro struttura non è nota ai moduli che li importano, due variabili di tipo opaco sono dello stesso tipo solo se dichiarate dello stesso tipo opaco. Ad esempio, dichiariamo i tipi opachi A e B:

TYPE
    A = FORWARD
    B = FORWARD

VAR
    a: A
    b: B
    c: A

Qui le variabili a c sono dello stesso tipo, mentre b è diversa. Tipi diversi non si possono assegnare nè confrontare fra di loro.

Se la struttura di un tipo opaco viene esplicitata, allora si applica la regola di equivalenza generale tra tipi. Ad esempio, se esplicitiamo i tipi opachi A e B come array di stringhe:

TYPE
    A = ARRAY OF STRING
    B = ARRAY OF STRING

allora le variabili a b c risultano equivalenti per tipo, non sono più opache e si possono dereferenziare normalmente.

Operazioni con i tipi opachi. Non si possono dereferenziare i campi di un tipo opaco (se è un RECORD) nè si possono dereferenziare gli elementi di un tipo opaco (se è un ARRAY). I tipi opachi possono essere utilizzati solo in uno dei modi seguenti:

  • Dichiarare tipi di dato, variabili e funzioni che usano il tipo opaco.

  • Assegnamento di NIL; assegnamento di una variabile dello stesso tipo; assegnamento del valore di ritorno da una funzione che ritorna lo stesso tipo.

  • Confronto per uguale o diverso da NIL o confronto per uguale o diverso con un'altra variabile dello stesso tipo FORWARD.

  • Passaggio di parametro a funzione.

 
<= Sezione TYPESezione VAR =>

Umberto Salsi

Contatto
Mappa
Home / Indice sezione