2010-08-14 9 views
11

jestem z imperatywem tle, ale tych dniach starają swoje ręce LISP (Common LISP)Niespodziewane wyjście z wad()

czytam here o cons że

(cons x dł):

podany obiekt LISP x i listę L, oceniający (przeciw x L) tworzy listę zawierającą x a następnie przez elementy L.

Kiedy celowo nie użyłem listy jako drugiego argumentu, tj. gdy użyłem

(cons 'a 'a) Spodziewałem się błędu, ale whoa! Mam (A . A).

Co ja przegapiłem i co to jest (A . A)?

Odpowiedz

7

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.

1

'a to lisp atom i (A . A) jest zdegenerowaną listą o nazwie cons cell lub "kropkowaną parą". Ponieważ nie przekazałeś listy argumentów L w (cons x L), odzyskałeś komórkę.

+1

CONS zawsze zwraca komórkę. –

1

(cons x L)

Biorąc pod uwagę x i L CONS zwraca nową komórkę minusy z X, gdy samochód tej komórki i L jak CDR komórki.

Listy są połączonymi łańcuchami komórek cons.

CL-USER 141 > (sdraw '(a b c)) 

[*|*]--->[*|*]--->[*|*]---> NIL 
    |  |  | 
    v  v  v 
    A  B  C 

CL-USER 142 > (sdraw (cons 'foo '(a b c))) 

[*|*]--->[*|*]--->[*|*]--->[*|*]---> NIL 
    |  |  |  | 
    v  v  v  v 
FOO  A  B  C 

Jeśli CONS dostaje dwa symbole jako argument wygląda to tak:

CL-USER 143 > (sdraw (cons 'foo 'bar)) 

[*|*]---> BAR 
    | 
    v 
FOO