Home / Indice sezione
 www.icosaedro.it 

M2 Report

<= CaratteristicheModuli =>
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
 

Un semplice esempio

Prima di analizzare nel dettaglio tutti gli aspetti del linguaggio, presentiamo qui un semplice esempio per comprendere lo spirito con il quale M2 è stato concepito. L'esempio è breve ma non troppo banale: vengono dati al programma una parola e un elenco di files, e il programma deve riportare sullo schermo i nomi dei files che contengono questa parola. Battezziamo il programma "cerca". Quello che vogliamo, in definitiva, è poter battere sulla tastiera un comando del tipo "cerca pippo file1 file2 file3 e ottenere in risposta i nomi dei file che contengono la parola "pippo". Il sorgente è corredato di commenti che dovrebbero consentirne la comprensione, almeno a grandi linee.

MODULE cerca

IMPORT m2  # utilita' generali: print().
IMPORT io  # accesso al file system: Open(), ReadLine(), Close().
IMPORT str # manipolazione stringhe: find()


    FUNCTION trovata(p: STRING, fn: STRING): BOOLEAN
    (*
        Ritorna TRUE se il file fn contiene la parola p.
    *)
    VAR 
        f: FILE
        linea: STRING
    BEGIN
        f->Open(fn, "r")
        LOOP
            linea = ReadLine(f)
            IF linea = NIL THEN  # fine del file
                f->Close()
                RETURN FALSE
            ELSIF find(linea, p) >= 0 THEN # trovata!
                f->Close()
                RETURN TRUE
            END
        END
        f->Close()
        RETURN FALSE
    END


VAR
    a: ARRAY OF STRING
    i: INTEGER
BEGIN
    # acquisisci parametri da linea di comando: a[0] e' il nome del
    # programma, a[1] e' il primo argomento, ecc.
    a = get_args()

    # assicura che ci sia almeno la parola da cercare:
    IF count(a) < 2 THEN
        error("Indica una parola da cercare e una lista di files\n")
        exit(1)
    END

    # cerca la parola a[1] in tutti i file:
    FOR i=2 TO count(a)-1 DO
        IF trovata(a[1], a[i]) THEN
            print(a[i] + "\n")
        END
    END
END

Il sorgente di questo programma viene scritto nel file cerca.mod, quindi viene compilato con il comando

$ m2 cerca.mod

che produce il codice eseguibile cerca pronto per l'uso. In questo primo esempio non ci siamo curati di vari dettagli dei quali invece un programma finito dovrebbe farsi carico. Ad esempio dobbiamo prevedere che l'utente sbagliarà inserendo nomi di file inesistenti. In un caso simile il programma terminerebbe segnalando un errore nell'accesso al file in questione:

$ ./cerca unaparola qUeStoFileNonEsisTe
io.Open(), line 104: qUeStoFileNonEsisTe: No such file or directory (code 2)

Questo è il comportamento conservativo e orientato alla sicurezza di M2. C'è poi l'istruzione TRY che permette di controllare gli errori ed intraprendere azioni alternative quando essi si presentano.

 
<= CaratteristicheModuli =>

Umberto Salsi

Contatto
Mappa
Home / Indice sezione