01.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!