Car e cdr

Da testwiki.
Vai alla navigazione Vai alla ricerca

Introdotte nel linguaggio di programmazione Lisp, car e cdr (pronunciato Template:IPA o Template:IPA) sono operazioni primitive che operano su liste concatenate composte da celle cons. Una cella cons è composta da due puntatori; l'operazione Template:Codice estrae il primo puntatore e l'operazione Template:Codice ne estrae il secondo.

Così, l'espressione Template:Codice restituisce x e Template:Codice restituisce y.

Quando le celle cons vengono usate per implementare liste singolarmente concatenate (piuttosto che alberi o altre strutture più complesse), l'operazione Template:Codice restituisce il primo elemento della lista mentre Template:Codice ne restituisce il resto. Per questo motivo queste operazioni vengono a volte chiamate Template:Codice (primo) e Template:Codice (resto) o Template:Codice (testa) e Template:Codice (coda).

Origine dei nomi car e cdr

In origine Lisp fu implementato su un computer IBM 704, nei tardi anni cinquanta. L'hardware del 704 aveva la possibilità di dividere le parole macchina di Template:M in quattro parti, una "parte indirizzo" (address part) e una "parte decremento" (decrement part) di Template:M ognuna e una "parte prefisso" (prefix part) e una "parte etichetta" (tag part) di tre bit ciascuna. Alcuni predecessori del Lisp inclusero funzioni chiamate Template:Codice (abbreviazione di Contents of the Address part of Register number), Template:Codice, Template:Codice e Template:Codice, ognuna delle quali prendeva come argomento un indirizzo macchina, ne caricava la corrispondente parola dalla memoria ed estraeva i bit appropriati. La macro assembly dell'IBM 704[1] per realizzare Template:Codice era

LXD JLOC 4
CLA 0,4
PDX 0,4
PXD 0,4

Una parola macchina poteva poi venire riassemblata dalla funzione Template:Codice, che prendeva quattro argomenti (

a,d,p

e

t

). Nelle prime fasi progettuali del Lisp, le parti prefisso ed etichetta vennero scartate, lasciando solo Template:Codice, Template:Codice e quindi una Template:Codice con soli due argomenti.[2]

I nomi Template:Codice e Template:Codice sono alternative moderne comuni a Template:Codice e Template:Codice per la loro maggiore chiarezza, ma, oltre che per motivi storici e di abitudine, Template:Codice e Template:Codice continuano a essere utilizzati anche perché offrono il vantaggio di poter esprimere loro corte composizioni attraverso funzioni equivalenti con nomi corti e più o meno pronunciabili. Per esempio, Template:Codice è equivalente a Template:Codice; il suo valore è Template:Codice (il primo elemento del resto di Template:Codice). In modo simile, Template:Codice è lo stesso di Template:Codice; il suo valore è Template:Codice. La maggior parte delle implementazioni Lisp imposta un limite massimo al numero di forme composte che supportano; il Common LISP e lo Scheme, per esempio, forniscono forme con fino a quattro ripetizioni di a e d. Mentre non risulta chiaro se forme composte complesse come Template:Codice risultino per un occhio non allenato più semplici da leggere rispetto alla forma estesa Template:Codice, queste forme composte risultano però convenienti per certi usi idiomatici, come disassemblare liste che rappresentano codice. Per esempio, data un'espressione lambda come la seguente:

 (lambda (a b) (una-cosa) (una-altra-cosa))

un programmatore Lisp esperto interpreterebbe

(let ((p1 (caadr form))
    (p2 (cadadr form))
    (body (cddr form))
...)

come l'estrazione del primo e del secondo parametro (a e b) in p1 e p2 e l'estrazione della lista contenente il corpo dell'espressione lambda in Template:Codice. Questo genere di "destrutturizzazione di una lista" è piuttosto comune, specialmente quando si scrivono macro, e le implementazioni Lisp moderne, come il Common Lisp, forniscono agevolazioni per realizzarle in maniera diretta. In Common Lisp, quel codice verrebbe espresso utilizzando la macro Template:Codice come:

(destructuring-bind ((p1 p2) &body body) (rest form)
...)

Note

Bibliografia

Voci correlate

Collegamenti esterni

Template:Portale