LISP
LISP sigla (dall’inglese List Processing) con cui si indica un linguaggio di programmazione introdotto per consentire un’agevole elaborazione di liste di dati simbolici. È stato il primo linguaggio di programmazione funzionale di tipo dichiarativo (è, quindi, un → linguaggio funzionale); esso è usato prevalentemente in ambiti di ricerca sull’intelligenza artificiale (sistemi esperti, robotica, giochi e riconoscimenti di schemi). John McCarthy ne gettò le basi nel 1956, presso il Dartmouth Summer Research Project on Artificial Intelligence; sviluppato come un’estensione del fortran, il lisp fu completato nella sua prima versione nel 1965. Studiato inizialmente più per gli aspetti teorici e logici che per la sua concreta implementazione, ha avuto vari sviluppi ed è attualmente considerato un linguaggio adatto alla manipolazione simbolica di formule matematiche, all’implementazione della programmazione funzionale, alla realizzazione di modelli di intelligenza artificiale. Il lisp si basa sul concetto di programma come funzione, e tutte le sue strutture di dati sono caratterizzate da liste chiamate S-expressioni, dove S sta per simbolico. La caratteristica di questa struttura è data dall’uso della notazione prefissa racchiusa tra parentesi (→ notazione). Per esempio, l’espressione numerica (+2 8) dà come risultato 10. Tale notazione è utilizzata indifferentemente sia per la scrittura del codice sorgente sia per i dati.
L’impostazione del lisp come linguaggio funzionale necessita del particolare formalismo della lambda notazione, che discende dal linguaggio formale astratto detto → lambda-calcolo e dall’impiego di combinatori per la manipolazione delle espressioni formali. Come avviene in generale in tutti i linguaggi funzionali, sono permessi solo due tipi di operazioni sulle funzioni: 1) la definizione; 2) l’applicazione. Concordemente con la lambda notazione, si può definire una funzione senza doverle dare un nome standard, ma semplicemente indicando i parametri formali della funzione e la sua operazione. Così, per esempio, poiché nel lambda-calcolo la funzione ƒ(x) può essere indicata come λxƒ e si possono considerare x e ƒ come due componenti il complessivo termine, in lisp una lambda-funzione avrà una scrittura del tipo
dove (x1 … xn) rappresenta la lista dei parametri, detti anche parametri formali della lista, e BODY è la definizione della funzione, che specifica come la funzione agisce. Per far diventare la lambda-funzione un’applicazione se ne modifica la forma aggiungendo i parametri attuali:
dove a1 … an sono i parametri attuali per x1 … xn.
Un semplice esempio di applicazione in lisp è il seguente:
Il corpo della funzione definisce dapprima la moltiplicazione di x per x (iniziando dalla parentesi più annidata) e poi addiziona il risultato a y; nella usuale notazione scriveremmo:
Nella pratica di programmazione in lisp risulta tuttavia difficile riferirsi a funzioni senza nominarle, soprattutto quando esse devono essere richiamate molte volte nel corso del programma. Il lambda-calcolo tuttavia supera questi ostacoli, utilizzando un’apposita sintassi e delle regole di riduzione che semplificano le espressioni e rendono più agevole l’uso della lambda notazione.