Nei linguaggi logici (come ii ~ro~og) e funziona (come Miranda) è molto diffuso lo stile di programmazione per "pattern matching", che potremmo definire "programmazione per casi". Anche E fornisce un operatore di questo tipo, con la seguente sintassi: espr espr-uni il cui significato è: cerca di far combaciare espr ed espr-uni, even- tualmente assegnando degli opportuni valori d e variabili contenute in espr-uni. Se le due espressioni combaciano, ritorna TRE, altri- menti FALSE. Nella versione attuale del compilatore, le due espres- sioni devono essere variabili, interi, liste (costanti o E-List, ma non liste con tipo) o liste Lisp, ma è prevedibile che le prossime versioni di E accettino anche stringhe, OBJECT e persino espressioni. Un semplice esempio: assegna 1 ad a, 3 a b e ritorna TRUE, mentre: I Il principalmente l'impossibilità di passare parametri a una di queste espressioni. A partire dalla versione 3, i1 linguaggio E mette a dispoSizione i puntatori a funzione, che risolvono entrambi questi problemi. Se il nostro programma contiene una procedura come: PROC somma(x,y) IS x+y è possibile ottenere un puntatore a essa tramite l'usuale operatore {I: Diventa quindi possibile passare questo puntatore ad al- tre procedure, memorizzarlo in strutture dati e così via; la procedura originale potrà essere invocata semplicemente con: che ritorna, ovviamente, 3. [1,2,3] [a,l,b] 11 È piuttosto semplice riscrivere MapList( ), ForAll( ) e si- FALÌE senza effettuare nessun asse@amento (le due espres- sioni non combaciano). Detto così, non è evidente il potere espres- sivo di questo costrutto, ma considerate questo esempio: ci voglia- mo servire di una sorta di "linguaggio" grafico per disegnare dei simboli; un disegno è dato da una lista di istruzioni, ogni istruzione è una lista composta dal nome deii'operazione e dai relativi para- metri. Un rettangolo potrebbe essere definito così: lato := [ [LINEA, 101, [DESTRA,90] ] rect := [ RIPETI, 4 ,lato] La procedura destinata al disegno potrebbe quindi essere definita, usando l'unificazione (e la ricorsione), in questo modo: Il PROC disegna(op:PTR T0 LONG) DEF a,i,o IF op [LINEA,a] disegnaLinea(ango10,a) ELSEIF op [DESTRA, a] angolo:=angolo+a ELSEIF op [RIPETI,a,o] FOR i:=l T0 a DO disegna(o) ELSEIF . . . ELSE /* sequenza di istruzioni */ FOR i:=O T0 ListLen(0p)-l DO disegna(op[i]) ENDIF ENDPROC Provate a scrivere questa stessa procedura con IF e assegnamenti tradizionali (senza dimenticare di controllare la lunghezza di ogni lista) e apprezzerete la differenza! mili usando i puntatori a funzione anziché le quoted ex- pression di un utile eserciziu); è possibile scrivere funzioni diverse, adatte a particolari esigenze. Ecco un esempio: PROC mapstring(s,proc) WHILE s[l DO s[l++:=proc(s[l) ENDPROC Questa procedura applica la funzione proc a tutti i carat- teri della stringa s, modificandola. A seconda della parti- colare proc fornita, essa può servire a convertire una stringa in minuscolo o maiuscolo, ma anche a codificarla in qualche modo (per esempio, con una sostituzione mo- noalfabetica) o a troncarla a un determinato carattere (scrivendo uno "\On al posto del carattere "terminatore"). Un esempio di uso sarebbe dunque: PROC oneline(c) IS IF c="\nU THEN " " ELSE C che trasforma tutti gli "a-capo" della stringa s in spazi, portandola (appunto) su una sola riga. Come già per le quoted expression, però, anche i puntatori a funzione ri- chiedono delle cautele particolari: in primo luogo, è re- sponsabilità del programmatore accertarsi che la chiama- ta a procedura tramite puntatore fornisca tutti i parametri richiesti dalla procedura originale (salvo quelli definiti "per default", che possono essere omessi); inoltre, è ne- cessario assicurarsi che il puntatore sia effettivamente un puntatore a procedura. Inutile dire che invocare una stringa come procedura, per esempio, ha certamente ri- sultati disastrosi (Guru a volontà). A
n'lE1R mRQJ@ KIT CDROM esterno per A1200 ed A600 cosi' composto: ACCESSORI ***NOVmA9 C2DRW MI=*** 5 AMINET 6 - shareware <strong>Amiga</strong> Giugno 95 AMINET SET 1 (4 CD) - Tutto Aminet fino a Gen.95 AMOS PD CD - Libreria ufficiale AMOS PD ANIMATIC - Oltre 600MB affascinanti animazioni FONTS CD - 18,000 files fonts: Adobe, PageStream etc. WORLD OF AMIGA - Utilities, Music, Tools, Comms etc. WORLD OF GAMES - Raccolta garnes shareware WORLD OF SOUNDS - Oltre 7,000 files: MODS, Vocs, MIDI ... 29,000 WORLD OF VIDEO - Videos, films per <strong>Amiga</strong>. Al primo ordine richiedete il nostro catalogo CDROM con oltre 800 titoli per <strong>Amiga</strong>, PC & MAC