Fino ad ora abbiamo analizzato script composti da un unico grande blocco di istruzioni, quello che nel C si chiama main, poiché le operazione svolte da essi non erano molto complicate. Ora inizieremo a lavorare anche con script che inglobano allinterno le subroutines (ovvero i sottoprogrammi).
I programmi non sono formati da un unico blocco di istruzioni eseguite in modo continuato, ma da elementi connessi in modo da raggiungere un determinato scopo, e il computer nelleseguirli passa da un punto allaltro del listato. I sottoprogrammi svolgono determinate istruzioni (a volte anche molto semplici) e ci fanno risparmiare molto tempo (e codice!) poiché una volta scritti possono essere invocati piu volte.
Ad esempio nel MacOS, il movimento del cursore del mouse è gestito da un determinato sottoprogramma e sia che stiamo lavorando nel Finder, sia che stiamo lavorando con ClarisWorks, le linee di codice utilizzate per gestirlo sono sempre le stesse.
Se il concetto non risultasse ancora chiaro, è esplicato in modo molto efficace dal seguente listato.
on saluto()
display dialog "hello world!"
end saluto
saluto()
Tra on saluto() ed end saluto ci sono tutte le istruzioni del sottoprogramma saluto.
Una volta dichiarato la subroutine e specificate le istruzioni di essa, per mandarla in esecuzione occorre invocarla (ovviamente é possibile invocarla in qualsiasi punto del listato, e non subito dopo!). Infatti se invece eseguite questaltro listato, non succedera nulla.
on messaggio_errore()
display dialog "errore!" with icon 0
end messaggio_errore
Cio avviene perché nonostante la subroutine messaggio_errore sia stata dichiarata, non è stata invocata. Per invocarla è sufficiente aggiungere al listato messaggio_errore() nel punto adatto del listato.
Ed ora vi propongo lo script Calcolatrice riscritto mediante luso dei sottoprogrammi.
global a, b, c
display dialog "Semplice calcolatrice" buttons {"OK", "Info"} default button 1
set scelta to button returned of result
if scelta = "Info" then
info()
end if
on info()
display dialog "Tutorial AppleScript per ilMac 1999 Alessandro Palmisano" buttons {"OK"}
end info
display dialog "Primo numero " default answer ""
set a to text returned of result
display dialog "Operatore" default answer ""
set oper to text returned of result
display dialog "Secondo numero " default answer ""
set b to text returned of result
if oper = "+" then
addizione()
end if
if oper = "*" then
moltiplicazione()
end if
if oper = "-" then
sottrazione()
end if
if oper = "/" then
divisione()
end if
on errore()
beep
display dialog "Error" with icon 0
end errore
on addizione()
try
a + b
display dialog "Il risultato è " & result
on error
errore()
end try
end addizione
on moltiplicazione()
try
a * b
display dialog "Il risultato è " & result
on error
errore()
end try
end moltiplicazione
on sottrazione()
try
a - b
display dialog "Il risultato è " & result
on error
errore()
end try
end sottrazione
on divisione()
try
a / b
display dialog "Il risultato è " & result
on error
errore()
end try
end divisione
Analizzandolo troviamo subito una nuova istruzione: global. Questa istruzione è stata aggiunta poiché le variabili a,b e c (rispettivamente il primo numero, il secondo e il risultato), sono utilizzate non solo nel listato principale, ma anche nei sottoprogrammi. Global quindi è una proprietà delle variabili che le rende accessibili in qualsiasi punto del listato, indipendentemente dal sottoprogramma.
Possiamo notare subito anche un risparmio di codice, ad esempio le istruzioni che mostrano il messaggio di errore (nel caso in cui si verifichi), al contrario del precedente listato, non sono ripetute per ognuna delle quattro operazioni. Una una volta dichiarate, sono riutilizzate piu volte semplicemente invocandole con la subroutine errore().
Allinizio del programma possiamo anche scegliere se utilizzarlo od avere le informazioni su di esso. Invece di utilizzare il solito costrutto if-else, è stata utilizzata anche qui una subroutine, che nel caso in cui venga premuto il pulsante Info, verrà eseguita. La stessa cosa vale per le quattro operazioni, ho scritto una subroutine per ognuna di esse.
Altra cosa da segnalare è che una subroutine è dichiarabile in qualsiasi punto del programma. Infatti, dal punto di vista dellordine, non è necessario prima scriverla e poi invocarla, ma è anche possibile il contrario (come avviene in questo caso).

