Funzioni di libreria: introduzione |
Proteus si distingue dagli altri processori di testo per il fatto che contiene in sè molte più funzioni predefinite per il trattamento dei dati; questa scelta progettuale, pur aumentando i requisiti di sistema per il funzionamento di Proteus, permette tuttavia di realizzare programmi molto più brevi e, in definitiva, più veloci, dal momento che molte delle funzionalità sono implementate a basso livello. Ciò aumenta anche la velocità di scrittura dei programmi Proteus, incrementando la produttività.
Le funzioni di libreria sono suddivise nelle seguenti categorie:
Vi sono alcune funzioni non classificabili all'interno di queste categorie ed elencate di seguito:
EVAL(exp1[, exp2..])
valuta tutte le espressioni passate e ritorna il valore dell'ultima espressione; ad esempio:
EVAL("CIAO", ADD(3, 5), MUL(6, 18), "HELLO, " "WORLD")restituisce: HELLO, WORLD
FUNC(fstr[, par1[, par2..]])
esegue la funzione corrispondente alla stringa fstr con i parametri indicati; fstr può essere una UDF oppure un'altra funzione di libreria, ad eccezione di PUB, AVLTRAVERSE, DICTRAVERSE, STRTRAVERSE, REXFSTRTRAN, REXIFSTRTRAN e di tutte le funzioni che prevedono il passaggio di una UDF; se il numero di parametri indicati non coincide con il numero di parametri richiesto dalla definizione della corrispondente funzione viene segnalato un errore durante l'esecuzione; lo stesso accade se la funzione indicata non risulta definita.
IIF(nTest, exp1, exp2)
ritorna exp1 se nTest != 0, exp2 altrimenti; il valore ritornato corrisponde al tipo di exp1 (o exp2, anche diversi); questa funzione è detta espressione condizionale in linea
ISET(id1[,id2..],exp)
assegna exp a id1, id2.., che devono essere tutti identificatori oppure invocazioni della funzione di libreria PUB su un identificatore; ritorna il valore di exp
PUB(id)
funzione utilizzabile solo all'interno di UDF; corrisponde all'utilizzo di id all'esterno della funzione; il suo unico parametro deve essere il nome di un identificatore (letterale, non tra virgolette); è l'unica funzione che può essere preceduta dal carattere '@' che indica il passaggio per riferimento, in quanto essa rappresenta in realtà un identificatore; in quanto tale, può essere impiegata anche in circostanze nelle quali è normalmente atteso un identificatore (es. ISET, argomento assegnato di FOR, ecc.). Può essere sostituita premettendo direttamente il carattere '_' all'identificatore; _id corrisponde infatti a PUB(id).
Alcune delle funzioni presentate (soprattutto nella categoria gestione strutture dati) sono dette 'con handles'; queste funzioni creano oppure operano con strutture permanenti create in memoria dinamicamente durante l'esecuzione; ciò implica la necessità di liberare opportunamente la memoria quando le informazioni sono state utilizzate e non sono più richieste, pena la progressiva saturazione delle risorse del sistema e la terminazione improvvisa dell'esecuzione (memoria esaurita).
Un handle è semplicemente un numero intero, che può essere memorizzato, passato alle funzioni o restituito da una UDF come qualsiasi altra variabile. Le funzioni con handle sono raggruppate logicamente in modo da avere una funzione costruttore (crea la struttura dati in memoria e restituisce il suo handle) ed una funzione distruttore (libera la memoria e rende invalido l'handle), più alcune altre funzioni per manipolare i dati finché esistono in memoria.
Un'altra considerazione importante riguarda gli argomenti con cui sono invocate le funzioni.
Come si è già avuto modo di menzionare, Proteus è un
linguaggio completamente funzionale, cioè privo di operatori.
Ciò ha permesso di eliminare completamente le parentesi
generalmente impiegate per stabilire l'ordine di valutazione
delle espressioni; se si specificano delle parentesi dove non
necessario (cioè ovunque, tranne subito dopo i nomi delle
funzioni e l'ultimo parametro di ciascuna invocazione), Proteus
segnala un errore sintattico.
Esiste, tuttavia, un'eccezione alla completa funzionalità del
linguaggio; infatti, Proteus è dotato di un operatore implicito,
cioé l'operatore di concatenamento.
Dal punto di vista logico e semantico, ciò non comporta alcun
problema nella definizione del linguaggio, in quanto l'operazione
di concatenamento stringhe è completamente associativa e,
essendo l'unica funzionalità sottesa da un "operatore"
(in senso lato) di cui è dotato il linguaggio, l'ordine di
valutazione è sempre univocamente determinato. Si è deciso di
dotare Proteus di questa caratteristica per permettere la
scrittura di espressioni più compatte e limitare in questo modo
il numero delle variabili che l'utente deve impiegare. Come già
detto, il concatenamento è contraddistinto da un operatore
implicito, cioè "invisibile"; esso si ottiene mediante
giustapposizione di due espressioni, come in questo esempio:
SET FH = FOPEN(BaseDir DIRLAST(H, 1), 1)
Quanto sopra è semanticamente identico all'espressione:
SET FH = FOPEN(STRCAT(BaseDir, DIRLAST(H, 1)), 1)
Il concatenamento implicito può avvenire in qualunque parametro con cui è invocata una funzione di libreria o UDF, oltre che, come già visto, negli argomenti di alcuni metodi. Come è immediatamente visibile, il suo impiego semplifica il codice, rendendolo più leggibile; poiché Proteus è orientato soprattutto all'elaborazione di testo, questo stratagemma permette di risparmiare molto tempo e di ottenere programmi più comprensibili.
Inizio pagina | Prossimo argomento | Argomento precedente | Indice per argomenti | Indice analitico |