| « Un'introduzione a Scheme #2 | Un nuovo inizio » |
In questo articolo introdurrò il linguaggio Scheme, uno dei principali dialetti Lisp oggi in uso.
La prima domanda che un lettore potrebbe porsi è: perché imparare un dialetto del Lisp? Non sono forse altri i linguaggi che oggi vanno per la maggiore? Il motivo per cui consiglio a tutti di imparare un dialetto del Lisp è ben spiegato da Eric S. Raymond:
LISP is worth learning for a different reason — the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use LISP itself a lot.
Un altro ottimo motivo è che Scheme è, a tutti gli effetti, un linguaggio di programmazione programmabile: si possono infatti implementare nuove forme sintattiche sopra a quelle esistenti, rendendo relativamente semplice adattare il linguaggio a noi stessi.
Se vi ho incuriosito almeno un po', continuate a leggere questa introduzione - vi assicuro che alla fine non ve ne pentirete.
Follow up:
Cosa serve per cominciare
La prima cosa da procurarsi è un interprete o un compilatore Scheme da installare sul proprio computer. Esistono varie implementazioni, ciascuna con pregi e difetti; io per questa serie di articoli userò PLT Scheme per tre motivi: è software libero, è multipiattaforma, ed è conforme all'ultima versione dello standard Scheme (il cosiddetto R6RS).
Prima di iniziare è bene spendere una parola sulla grande debolezza dei dialetti Lisp, che allo stesso tempo è anche il loro più grande punto di forza: le parentesi. Consideriamo il seguente blocco di codice:
Scheme:
| (define (fact n) | |
| (define (fact-tail acc n) | |
| (if (= n 0) | |
| acc | |
| (fact-tail (* acc n) (- n 1)))) | |
| (fact-tail 1 n)) |
Come si può vedere, ci sono tante parentesi, anche in una definizione così breve. Anche se all'inizio questo può sembrare un'ostacolo insormontabile, con un po' di disciplina nell'indentazione e con un buon editor che evidenzi le coppie di parentesi si riesce a scrivere del codice senza impazzire. A questo proposito vi segnalo che all'interno di PLT Scheme è disponibile DrScheme, un editor con colorazione della sintassi, indentazione automatica, un interprete per valutare rapidamente espressioni e tante altre comode funzioni. In seguito vedremo che c'è un motivo per questo dilagare di parentesi, e che il consumarsi dei tasti 8 e 9 sulla tastiera è compensato da una potenza inimmaginabile per altri linguaggi.
Primi passi
La prima cosa da dire su Scheme è che, contrariamente ai linguaggi più diffusi, viene usata sempre la notazione prefissa e mai quella infissa. Nei linguaggi quest'ultima, la somma di due valori si scrive come a + b: l'operatore si trova "in mezzo" agli operandi. In Scheme invece, l'operatore precede sempre gli operandi, e lo stesso codice può essere espresso come (+ a b). Anche se a prima vista questo potrebbe sembrare controintuitivo e scomodo, prendiamo il caso in cui si debbano sommare più valori: in notazione infissa dovremmo scrivere a + b + c + d + e, in Scheme (+ a b c d e). Se ci soffermiamo un attimo a osservare il codice proposto, notiamo come l'espressione di somma sia racchiusa tra parentesi: questo è dovuto al fatto che in Scheme le chiamate a funzione si esprimono come (funzione argomento1 argomento2 ...), e sommare dei numeri si traduce in applicare la funzione + agli addendi. Ovviamente le chiamate a funzione possono essere nidificate, e quindi (* (+ 3 1) 2) è un'espressione perfettamente valida che ha come risultato 8. Per ogni chiamata vengono prima valutati gli argomenti, e poi richiamata la funzione sui risultati ottenuti; in altre parole l'ultimo esempio si traduce in (* 4 2) prima che sia richiamata la funzione *.
Non solo funzioni
Quanto detto nel paragrafo precedente si applica nel cui il primo simbolo dopo la parentesi aperta corrisponda ad una funzione. Ci sono alcuni simboli, che chiameremo forme speciali, che si comportano in maniera leggermente diversa. Consideriamo, ad esempio, il classico if, e paragoniamo i seguenti frammenti di codice C e di codice Scheme:
C:
Scheme:
| (if (< x 3) | |
| (display "OK") | |
| (display "KO")) |
Il codice Scheme è in tutto e per tutto uguale a un'applicazione di una funzione, ma qui c'è una differenza importante: non tutti gli argomenti, infatti, vengono valutati. Nell'espressione (if condizione se-vero se-falso) prima viene valutato l'argomento condizione, e successivamente l'argomento se-vero (nel caso che condizione sia vera) o se-falso (nel caso che condizione sia falsa), ma mai tutti e due. Queste forme speciali, unite alle funzioni, costituiscono tutta la sintassi del linguaggio, e presto capiremo il perché di questa linearità estrema nella formulazione di espressioni.
Direi che come prima puntata può bastare. Nel prossimo articolo parleremo di liste, della forma speciale lambda per definire proprie funzioni, e del perché di tutte quelle parentesi.
Stay tuned.
Trackback address for this post
Trackback URL (right click and copy shortcut/link location)
No feedback yet
Comments are not allowed from anonymous visitors.
Recent comments