Che ci crediate o meno, questa è in realtà una questione religiosa.
Ci sono dialetti a cui la gente osa riferirsi come una sorta di Lisp in cui le liste vuote sono consi o oggetti aggregati di qualche tipo, piuttosto che un semplice atomo come nil
.
Ad esempio, in "MatzLisp" (meglio noto come Ruby) gli elenchi sono in realtà matrici.
In NewLisp, gli elenchi sono contenitori: oggetti di tipo elenco che contengono un elenco collegato degli elementi, quindi gli elenchi vuoti sono contenitori vuoti.[Reference].
Nei linguaggi Lisp che non sono spettacolari senza cluster di questo tipo, le liste vuote sono atomi e le liste non vuote sono celle binarie con un campo che contiene il primo elemento e un altro campo che contiene il resto del elenco. Le liste possono condividere suffissi. Dato un elenco come (1 2 3)
, possiamo utilizzare cons
per creare (a 1 2 3)
e (b c 1 2 3)
che condividono entrambi lo spazio di archiviazione per (1 2 3)
.
(In ANSI Common Lisp, l'elenco atomo vuota ()
è lo stesso oggetto come il simbolo nil
, che valuta se stessa e serve anche come booleano falso. Nello schema, ()
non è un simbolo, ed è distinto dal Boolean false #f
oggetto. Tuttavia liste regime sono sempre costituita da coppie, e terminato da un atomo.)
la capacità di valutare (car nil)
non segue automaticamente dalla rappresentazione cons-e-nil di liste, e se guardiamo nell'antica documentazione Lisp, come il manuale Lisp 1.5 dei primi anni del 1960, qualcosa, scopriremmo che era assente. Inizialmente, car
era strettamente un modo per accedere a un campo della cella di controllo e richiedeva rigorosamente un argomento di cella di controllo.
Le buone idee come consentendo (car nil)
a Just Work (in modo che gli hacker potrebbero tagliare molte righe di codice inutili dai loro programmi) non appariva durante la notte. L'idea di consentire (car nil)
potrebbe essere stata visualizzata da InterLisp. In ogni caso, la rivista Evolution Of Lisp afferma che MacLisp (uno degli importanti predecessori di Common Lisp, non correlato a Apple Macintosh che venne vent'anni dopo), imitò questa funzione da InterLisp (un altro dei predecessori significativi).
piccoli dettagli come questo fanno la differenza tra piacevole programmazione e giurando sul monitor: si veda ad esempio A Short Ballad Dedicated to the Growth of Programs ispirato lotta di un programmatore Lisp con un dialetto bletcherous in cui le liste vuote non è possibile accedere con car
, e non servono da booleano falso.
Ho modificato il post per utilizzare 'defun' e non' define', che è di Scheme. Non mi aspetto che tu stia parlando di Scheme, poiché Scheme non ha 'nil', non ti permette di passare in una lista vuota a' car' e 'cdr', e l'uso della lista diretta la mutazione è molto più disapprovata nella comunità di Scheme. –
c'è anche la tecnica [* head sentinel *] (http://stackoverflow.com/search?q=user%3A849891+head+sentinel), per uso personale: iniziare con un elenco di singleton non vuoto, ad esempio '(1) o qualunque cosa; elaborarlo chirurgicamente in modo uniforme e restituire il suo 'cdr' alla fine. Consente una buona semplificazione del codice al prezzo di un'ulteriore allocazione delle celle. –