Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Le strutture dati (parte III)<br />
Come annunciato nell'ultima puntata, eccoci qui a conti-<br />
nuare il nostro esame dei tipi di dato ammessi dal lin-<br />
guaggio E. Questo mese affronteremo argomenti piutto-<br />
sto complessi, ma non è il caso di lasciarsi scoraggiare: le<br />
tecniche che esporremo, sebbene molto potenti, sono di<br />
impiego piuttosto raro e, quindi, non è indispensabile<br />
padroneggiarle a perfezione per raggiungere i propri<br />
obiettivi programmando in E.<br />
Le "quoted expression"<br />
Le quoted expression (letteralmente: espressioni "citate"),<br />
che E eredita dal linguaggio Lisp, consentono di trattare<br />
come dati delle intere espressioni: attenzione, non il va-<br />
lore delle espressioni, ma le espressioni in sé. La sintassi<br />
di questo costrutto è molto semplice: basta indicare<br />
l'espressione, preceduta dal cosiddetto "backtick", cioè<br />
l'accento inverso o grave (da non confondere con l'apice,<br />
cioè l'apostrofo o accento acuto, usato per delimitare le<br />
stringhe), come in:<br />
i1 valore di una quoted expression è (ancora!) una<br />
LONG, contenente un puntatore a un frammento di codi-<br />
ce che valuta l'espressione indicata; la valutazione effetti-<br />
va può essere poi richiesta per mezzo della funzione<br />
Eval( ), che ha come unico parametro un puntatore di<br />
questo tipo.<br />
È il momento di un esempio chiarificatore. Consideriamo<br />
il seguente codice:<br />
l DEF x=3,qe,a<br />
2 qe:='2*x<br />
3 a:=Eval(qe)<br />
a riga 1 vengono definite tre variabili, una delle quali (x)<br />
è inizializzata al valore 3. Subito dopo, alla riga 2, incon-<br />
triamo una quoted expression: a IIqeII viene assegnato il<br />
puntatore al codice che valuta "2*xn. Alla riga 3, final-<br />
mente, viene usata la funzione Eval( ), che riceve il pun-<br />
tatore qe e causa la valutazione dell'espressione. Poiché<br />
L'ottava puntata del corso di <strong>Amiga</strong> E<br />
x vale in questo momento 3, l'espressione valutata varrà<br />
2*3=6, e questo sarà il valore restituito da Eval( ) e asse-<br />
gnato ad a.<br />
Ci si potrebbe chiedere: qual'è l'utilità di questo meccani-<br />
smo? All'apparenza, infatti, sembra che si tratti di un'inu-<br />
tile complicazione di affari semplici, ma in realtà può es-<br />
sere estremamente pratico costruire un ARRAY o una li-<br />
sta di quoted expression e poi scegliere all'interno di es-<br />
sa in base a qualche criterio particolare. I1 fatto poi che<br />
la chiamata di procedura sia a tutti gli effetti un'espres-<br />
sione, fa sì che sia possibile svolgere qualunque tipo di<br />
computazione all'interno di una quoted expression, come<br />
in questo caso:<br />
in cui la chiamata Eval(qe) causa la scrittura in output<br />
della stringa T.<br />
Quando si usano le quoted expression, occorre osservare<br />
alcune cautele: in primo luogo, poiché non è possibile<br />
passare dei parametri all'espressione "citata", tutti i riferi-<br />
menti a variabili dovranno essere relativi a variabili glo-<br />
bali (visibili in tutto il programma) o a variabili locali visi-<br />
bili alla procedura che esegue l'Eval( ): in pratica, l'uso di<br />
variabili locali è ammesso soltanto se la definizione<br />
('exp) e la valutazione (Eval( )) si trovano nella stessa<br />
procedura. I1 compilatore di E non effettua (e non può<br />
effettuare) controlli su questa regola, quindi è compito<br />
del programmatore accertarsi che essa venga rispettata.<br />
Allo stesso modo, Eval( ) non può sapere se il puntatore<br />
che le viene passato è relativo a una quoted expression o<br />
meno: particolarmente insidioso è il caso in cui si sia<br />
omesso il backtick. come in:<br />
DEF x=3,qe,a<br />
qe:=2*x