Programmare in Lisp – Lezione 1

Perché Lisp?

Lisp non è un linguaggio mainstream. Non è assolutamente diffuso come C, C++, Java o PHP. Viene utilizzato oggi da un numero ristretto di persone se facciamo un paragone con questi ultimi linguaggi. Perciò potreste chiedervi perché diavolo mi sto prendendo la briga di scrivere un tutorial proprio su questo linguaggio e soprattutto chi mai potrebbe interessare!

Bene, questa volta, per darvi le giuste motivazioni, lascerò parlare altri ben noti personaggi al mio posto. Qualche citazione:

“In assoluto il più grande linguaggio di programmazione mai creato!”

Alan Kay - Creatore di Smalltalk

“Vale la pena imparare Lisp per il profondo senso di illuminazione che si prova quando finalmente lo si comprende; questa esperienza vi farà progredire come programmatori per il resto dei vostri giorni, anche se nella pratica non doveste mai impiegare Lisp un granché.”

Eric Raymond

“Lisp è il più potente ed elegante fra tutti i linguaggi di programmazione. È il linguaggio che il progetto GNU preferisce sempre.”

Richard Stallman – Fondatore del progetto GNU

“Non era certo nostra intenzione convertire i programmatori Lisp; il nostro target in realtà erano i programmatori C++. Siamo riusciti a portare una buona parte di loro a metà strada verso Lisp … non siete contenti?”

Guy Steele Jr. – Co-autore dello standard Java

Primi passi

La prima cosa da fare è procurarvi un buon ambiente di programmazione. Lisp è un linguaggio sia interpretato, come Python, che compilabile, come C. In realtà la sua potenza sta proprio nella sua “omoiconicità”, cioè il poter rappresentare se stesso mettendo dati e programmi sullo stesso piano. È il solo linguaggio non sperimentale che ha questa caratteristica ed è per tale motivo che può essere considerato unico nel suo genere. Lisp è un linguaggio di programmazione “programmabile”. È ciò che volete che esso sia: funzionale, ad oggetti, imperativo, logico … qualsiasi cosa!

Paul Graham ha recentemente affermato che nel corso del tempo e soprattutto negli ultimi decenni, un po’ tutti i linguaggi di programmazione mainstream più importanti e potenti, a partire da Java fino a Python e Ruby, stanno lentamente incorporando caratteristiche che Lisp ha scoperto molti anni prima (garbage collection, funzioni generiche, closures, ecc… ). C’è una convergenza molto evidente in questa direzione.

Implementazione

Per muovere i primi passi, vi consiglio di utilizzare l’interprete GPL CLISP che fa parte dei pacchetti ufficiali di Ubuntu/Kubuntu. Lo potete installare con Synaptic molto facilmente. Oppure, dal terminale, eseguite:

sudo apt-get install clisp

Per scrivere i programmi basta un buon editor come Kate. Più in là vedremo invece quello che può fare il potentissimo EMACS, scriptabile proprio in Lisp, che persino Linus Torvalds impiega per scrivere il kernel del nostro sistema operativo.

Qualche esempio interattivo

Avviate l’interprete CLISP dal terminale. Lisp è un linguaggio molto particolare anche perché impiega una notazione prefix invece che infix come tutti gli altri. Questa è una delle ragioni principali per cui soprattutto i neofiti hanno difficoltà a leggere i programmi Lisp.

Ma è solo un ostacolo apparente. In realtà, questa notazione è uno dei maggiori punti di forza di Lisp, che consentono al linguaggio di rappresentare programmi e dati nello stesso modo, arrivando a livelli di astrazione elevatissimi, praticamente sconosciuti agli altri linguaggi di programmazione. Dovete solo pazientare un po’ fino a quando la notazione vi sembrerà quasi naturale e ne apprezzerete l’eleganza e soprattutto la consistenza, che ne sono la sua principale ragion d’essere (altrimenti i lispers sarebbero proprio dei masochisti, vi pare?).

Avviato l’interprete, dopo un breve messaggio iniziale, vedrete il prompt:

[1] >

Il numero in parentesi quadre indica la sequenza di comandi introdotti fino a quel momento. Proviamo con qualche operazione aritmetica:

[1] > (+ 2 2 6 9)
19

[2] > (* 3 2 4)
24

[3] > (- 10 4)
6

[4] > (+ 2/3 1/2)
7/6

Come avrete notato, grazie alla notazione infix possiamo operare su più argomenti con un solo operatore. Inoltre, sempre con questa notazione, è impossibile introdurre anche solo una parentesi in più o in meno del necessario, a differenza di quella tradizionale in cui potenzialmente il numero di parentesi è arbitrario! Infine, osservate il supporto di Lisp per i numeri razionali che è molto raro trovare negli altri linguaggi. Le capacità di calcolo matematico di Lisp sono fra le più notevoli che esistono nel campo della programmazione.

Hello World

La solita tradizione. La sto rispettando per tutti i corsi di KubuntuItalia. Non mancherà neanche in questo caso :) . Bene, i programmatori Python si vantano che il loro “Hello World!” sia tra i più brevi che si possono trovare. Vediamo come se la cava Lisp in tal senso. Proviamo dapprima con un comando immediato. Dal terminale,

> (format t "Hello World!")
Hello World!
NIL

Se vi state chiedendo cos’è NIL, è il valore della funzione che avete appena chiamato, per cui la stampa del messaggio “Hello World!” è in realtà un side-effect. Vedremo in seguito come sopprimerlo se lo si desidera.

Ma facciamo di più. Creiamo una funzione “hello” che stampi il messaggio. Sempre dal terminale, inserite:

> (defun hello () (format t "Hello World!"))
HELLO

Il sistema ci ha appena informato che la funzione hello è corretta ed è stata incorporata nello spazio dei nomi delle funzioni con nome HELLO, appunto. Se per qualche ragione, l’operazione non dovesse andare a buon fine, magari per un refuso o altro, ricordate che Lisp vi farà entrare sempre automaticamente in modalità “debugging” per poter analizzare meglio l’accaduto. Per uscire e tornare all’interprete dei comandi, dovete premere la combinazione di tasti Ctrl-D. Proviamo ora a chiamare la suddetta funzione:

> (hello)
Hello Wolrd!
NIL

Stesso risultato di prima, ma con la differenza che ora possiamo chiamare questa funzione tutte le volte che vogliamo. Il nostro primo piccolo passo verso l’astrazione! :)

Sommario

Abbiamo elencato tutti i pregi e le potenzialità del linguaggio di programmazione Lisp. Il dialetto in particolare che stiamo utilizzando è Common Lisp e l’interprete è CLISP. Lisp è un dei primi linguaggi di programmazione ad alto livello. Fu creato nel 1958 dal matematico John McCarthy e ancora oggi rappresenta un faro per tutti gli altri linguaggi, a testimonianza della bontà del progetto e della lungimiranza del suo autore.

About these ads

4 risposte a Programmare in Lisp – Lezione 1

  1. Matley scrive:

    Ottimo spunto su un linguaggio che avrebbe solo bisogno di piu’ hype.

    Per rendersi conto del fatto che Common Lisp e’ compilato (per specifica) installate sbcl (disponibile sempre su debian e ubuntu nei repository ufficiali) e dopo aver digitato al prompt:

    * (defun hello () (format t “Hello World!”))

    digitate quindi:

    * (disassemble ‘hello)

    A presto

  2. Alessandro scrive:

    Articolo interessante, soprattutto perchè orientato ai neofiti.
    Vorrei segnalare anche un altro Lisp (molto più vicino a Scheme però), si chiama “newLisp”.
    Non voglio scatenare un flame, e so che molti lo ripudiano perchè è un pò più “sporco” del vero Lisp, ma è un linguaggio più orientato allo scripting.
    E’ open source, veloce, costantemente aggiornato, con una comunity molto attiva.
    Io ho un blog in italiano su tale linguaggio (http://newlisp.wordpress.com).
    Non intendo assolutamente fare paragoni con altri linguaggi (sia funzionali che non), ma vi posso garantire che merita una occhiata!
    Il sito originale è:
    http://www.newlisp.org

    Grazie.

  3. olimpius scrive:

    lisp è unico, non ci sono parole per descriverlo, vi consiglio a tutti a provarlo…
    è matematico, è basato sulle liste, è buono sia per algoritmmi ricorsivi sia per iterativi, è intuitivo, è pratico, … … … è Lisp

  4. Fisher scrive:

    Bell’articolo, davvero interessante.
    Colgo l’occasione per segnalare l’apertura di un forum su Scheme: schemers.altervista.org.

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

%d bloggers like this: