Quickloox

Dal mondo Apple all'universo digitale, in visualizzazione rapida dell'ovvio

7 apr 2008

AppleScript: se questo è un uovo

Qualcuno avrà letto della particolarità della Pasqua appena trascorsa, insolitamente anticipata nel calendario.

Carlo ha inviato uno script che calcola la data della Pasqua per un anno qualsiasi.

È molto semplice; usa quasi solo comandi elementari, che abbiamo già visto. È molto complicato; la formula per calcolare la Pasqua è a dire poco elaborata. Per gli interessati, rimando a Wikipedia per tutti i dettagli e a God Plays Dice per una formula vera e propria. Per i fanatici del calendario il testo definitivo è The Calendar Faq, ma sto divagando.

Prima vediamo alcune istruzioni che non conosciamo ancora e il loro significato. Le presenterò avulse dallo script. Poi arriverà lo script vero e proprio, che si “limita” a tradurre la formula in AppleScript. Visto da lontano lo script sembra di una difficoltà pazzesca e se invece lo si guarda istruzione per istruzione si tratta solo di tanto lavoro sulle variabili e tante operazioni aritmetiche.

on EasterDate(aYear)

In gergo programmatorio, on è una handle, una maniglia. In pratica è un contenitore. Tutto quello che sta tra on e end fa parte di un blocco di operazioni che riguarda una attività specifica. È una definizione di funzione. EasterDate (data Pasqua) è il nome dato da Carlo alla funzione. aYear (un anno) è il parametro. Avrebbe potuto chiamare la funzione Pasqua(anno) e sarebbe stata la stessa cosa. A un certo punto nello script apparirà una riga

end EasterDate

La cosa interessante è che un blocco di istruzioni on non viene eseguito quando compare nello script, bensì quando c’è un’istruzione che lo chiama (afferra la maniglia, per così dire). Si vedrà che nello script il blocco on compare all’inizio, ma viene eseguito solo alla penultima riga dello script.

copy aYear to J

copy è un altro modo di assegnare un valore a una variabile (inserire un contenuto in un contenitore), analogo a set, che conosciamo già. È come dire copia questo valore in questa variabile anziché imposta questa variabile a questo valore.

copy (19 * a + 24) mod 30 to d

mod è il resto di una divisione intera e si attacca a un’altra operazione. Qui, qualunque cosa accada dentro la parentesi viene divisa per 30 e il resto dell’operazione viene copiato dentro la variabile d. Facciamo finta che a valga 7. Succederebbe che 19 * 7 = 133 e che 133 + 24 = 157. Per fare 157 mod 30 si divide in modalità intera 157 per 30. Il risultato è 5 e il resto è 7. 157 mod 30 = 7.

set Easter to ((OT as text) & “/” & OM as text)

as text è un esempio di coercion, coercizione. Si verifica quando abbiamo dati di un tipo (per esempio numeri) e vogliamo gli stessi dati in un’altra forma (per esempio caratteri). Se scrivo 44 dentro la Calcolatrice è diverso dallo scrivere 44 dentro TextEdit, giusto? Qui è la stessa cosa. Nello script in questo momento OT contiene un numero, ma per compiere l’operazione successiva è necessario che quel numero venga interpretato come serie di caratteri, appunto as text, come se fosse testo.

set ThisDate to current date

current date, la data di adesso, è una frase propria di AppleScript, che è a nostra disposizione quando serve, appunto, la data odierna.

set ThisYear to result

Anche result è una parola riservata di AppleScript. Serve a contenere il risultato di un’operazione che vogliamo usare subito dopo, senza doverlo mettere per forza in una variabile.

set dialogresult to display dialog “Inserisci un anno (a quattro cifre)” & return default answer ThisYear buttons {“OK”, “Annulla”} default button 1

Finora abbiamo pubblicato qualche finestra di dialogo al minimo sindacale. Questa istruzione mostra che in effetti una finestra di dialogo può fare di più. Si può assegnare una finestra di dialogo a una variabile; si può stabilire il numero dei pulsanti e il loro contenuto, nonché indicare qual è il pulsante di default, quello che è evidenziato e si attiva se premiamo Invio; eccetera. Non mi dilungo perché ci si può giocare facilmente e imparare giocando: come creare una finestra di dialogo con cinque pulsanti? come avere evidenziato il quarto pulsante dei cinque? Le risposte sono tutte dentro questa riga. (Scrivimi se non sono chiare).

set ButtonPressed to button returned of dialogresult

Si può assegnare a una variabile il pulsante premuto in una finestra di dialogo…

set MyYear to text returned of dialogresult

…e si può assegnare a una variabile il testo che è stato inserito in una finestra di dialogo. button returned e text returned sono frasi del vocabolario di AppleScript.

set ThisEaster to EasterDate(MyYear) of me

Qui la variabile è ThisEaster (questa Pasqua) e il suo contenuto è l’intera funzione EasterDate, che ha come parametro la variabile MyYear. Questo passaggio è concettualmente un po’ difficile lo si capisce solo studiando per bene l’andamento dello script. of me è un’altra frase del vocabolario di AppleScript. Siccome bisogna spiegare allo script dove sta la funzione, in questo caso si può dire semplicemente of me, di me; la funzione sta qui dentro questo stesso script. Questo è concettualmente molto difficile… ma va affrontato, prima o poi. È un po’ come se uno dicesse all’amico mi prendi il telefonino, per favore? Sta qui nella tasca interna della mia giacca. Uno sa dove sta il suo telefonino, ma se ha le mani occupate deve chiarire anche l’ovvio.

Adesso lo script nella sua interezza. Lo si dovrebbe poter copiare e incollare comodamente in Script Editor. Se ci fossero problemi, lo mando via mail a chi mi scrive.

on EasterDate(aYear) copy aYear to J copy J mod 19 to a copy J mod 4 to b copy J mod 7 to c copy (19 * a + 24) mod 30 to d copy (2 * b + 4 * c + 6 * d + 5) mod 7 to e copy 22 + d + e to OT copy 3 to OM if OT > 31 then copy d + e - 9 to OT copy 4 to OM end if if OT = 26 and OM = 4 then copy 19 to OT end if if OT = 25 and OM = 4 and d = 28 and e = 6 and a > 10 then copy 18 to OT end if

set Easter to ((OT as text) & "/" & OM as text)

return Easter

end EasterDate

set ThisDate to current date get year of ThisDate set ThisYear to result

set dialogresult to display dialog “Inserisci un anno (a quattro cifre)” & return default answer ThisYear buttons {“OK”, “Annulla”} default button 1 set ButtonPressed to button returned of dialogresult set MyYear to text returned of dialogresult

set ThisEaster to EasterDate(MyYear) of me

display dialog “La Pasqua per l’anno " & MyYear & " si festeggia il " & ThisEaster

Un grosso grazie a Carlo!

Commenta