Cons
konstruuje "komórka przeciw". To nie ma nic wspólnego z listami na początku. Komórka cons to para dwóch wartości. Komórka jest reprezentowana w formie pisemnej przez "parę przerywaną", np. (A . B)
, która zawiera dwie wartości: 'A
i 'B
.
Dwa miejsca w komórce zaatakowanej to "samochód" i "cdr". Można wyobrazić taką minusy komórkę jako dwudzielna bloku:
car cdr
+-----+-----+
| A | B |
+-----+-----+
W Lisp, wartość może być również odniesienie do czegoś innego, na przykład, inna komórka minusy:
+-----+-----+ +-----+-----+
| A | --------> | B | C |
+-----+-----+ +-----+-----+
To byłoby reprezentowane w postaci "kropkowanej pary" jako (A . (B . C))
. Można kontynuować tak:
+-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | D |
+-----+-----+ +-----+-----+ +-----+-----+
To (A . (B . (C . D)))
. Jak widać, w takiej strukturze wartości zawsze znajdują się w komórce kuwety, a cdr
wskazuje na resztę struktury. Wyjątkiem jest ostatnia wartość, która jest ostatnią wartością cdr
. Nie potrzebujemy tego wyjątku: w Lisp jest specjalna wartość NIL
, co oznacza "nicość".Poprzez umieszczenie NIL
do ostatniego cdr
, masz pod ręką wartości wskaźnikowych, a wszystkie Twoje wartości są w car
s:
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | --------> | D | NIL |
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
ten sposób lista jest skonstruowana w Lisp. Ponieważ (A . (B . (C . (D . NIL))))
jest nieco nieporęczny, może być również reprezentowany po prostu jako (A B C D)
. NIL
jest również nazywana pustą listą ()
; są wymienialne zapisy dla tego samego. Teraz można zobaczyć, dlaczego (cons x list)
zwraca inną listę. Cons
prostu konstruuje inną komórkę minusy z x
w car
oraz odniesienie do list
w cdr
:
+-----+-----+
| X | --------> list
+-----+-----+
a jeśli list
jest (A B)
, to działa jako:
+-----+-----+ +-----+-----+ +-----+-----+
| X | --------> | A | --------> | B | NIL |
+-----+-----+ +-----+-----+ +-----+-----+
Więc (cons x '(a b))
ocenia się (x a b)
.
Listy są jednym z bardzo częstych zastosowań komórek konsumenckich. Można również konstruować dowolne drzewa z komórek konsolowych, okrągłych lub z dowolnego grafu.
CONS zawsze zwraca komórkę. –