Czym dokładnie jest definicja wspólnej komórki Lisp? Czym różni się Cell Cons od standardowego elementu listy powiązanej? W końcu zarówno komórka cons, jak i pozycja listy połączonej mają wartość i wskaźnik do następnej komórki lub elementu ... czy to zrozumienie jest złe?Jaka jest definicja komórki Lisp Cons?
Odpowiedz
Komórki cons ogólnie mają dwa wskaźniki, które mogą wskazywać na wszystko. Ogólnym zastosowaniem oczywiście jest wskazanie "wartości" lewej i innej komórki Cons (lub zerowej) z "prawą".
komórki cons mogą również utrzymywać wartości bezpośrednio, bez posiadania wskaźników. Ac komórka cons z (cons 1 2) będzie miała wskaźniki do liczb, ale może przechowywać je bezpośrednio (to samo dla innych małych elementów, takich jak znaki). –
nie będzie mieć wskaźników do liczb, to znaczy –
Komórka jest bliżej węzła drzewa binarnego niż połączonego węzła listy. car i cdr zwracają dwójkę dzieci, które mogą być zerowe, atomy lub inne komórki cons.
Aby podkreślić to rozróżnienie, nie ma wymogu, aby drugi element był kolejnym komórką. '('tofu.1)' jest poprawną komórką cons. – Chuck
W Lisp komórka po stronie zawiera parę wartości. Jeśli komórka cons jest w zmiennej c
, to (car c)
zwraca pierwszą wartość, a (cdr c)
zwraca drugą.
Zgodnie z przyjętą konwencją lista składa się z komórek cons, gdzie car
komórki zawiera wartość węzła, a cdr
zawiera odniesienie do następnego węzła lub zera (pusta lista) w celu wskazania końca listy. Kiedy funkcje pierwotne zwracają lub akceptują listy, jest to format, w którym lista jest prezentowana.
Dlatego do listy l
, (car l)
daje pierwszy element (wartość w pierwszym cons komórki) oraz (cdr l)
przywraca końca listy (następny przeciw komórki na liście).
Myślę, że inne odpowiedzi tutaj, choć dokładne, nie mówią jednoznacznie o jednym.
W tradycyjnym C++ połączone realizacji liście, dwa pola (val
i next
, powiedzmy) są wpisane. next
jest zdefiniowany jako wskazujący na inny węzeł na liście, przy czym terminatorem jest null
. Nie możesz wskazać niczego, co jest , ale inny węzeł z next
.
Lispy są wpisywane dynamicznie, więc każde pole w komórce może być dowolne () (albo atom, albo odniesienie). Możesz zaimplementować połączoną listę z komórkami cons (to wszystko lista Lisp to: łańcuch komórek cons z terminatorem nil
), ale możesz także umieścić dowolne wartości w każdym polu, używając komórki cons jako pary współrzędnych, drzewa węzeł itp.
Można nawet połączyć te; na przykład, wykaz x
y
Współrzędne
;; (cons foo (cons bar nil)) == (list foo bar)
(cons
(cons 5 4)
(cons (cons 9 10) nil))
=>
((5 . 4) (9 . 10))
wagonika komórka jest zatem ściśle szersze niż połączonego węzła liście; jest bliżej "zastosowanej pary", że tak powiem. Wszystkie standardowe funkcje przetwarzania listy (, dolist
, itp.) To po prostu funkcje, które przyjmują wartości car
i inną listę w cdr
.
Wszystko to oznacza, że - jeśli chce - można zdefiniować listy tyłu z car
skierowaną do następnego cons komórki i cdr
wskazując na wartości! Aby to zrobić z połączonym węzłem listy, musisz zmienić definicję klasy lub struktury danych, aby zmienić typy.
cons
komórek jest jedną trzecią umowy obejmującej cons
, car
i cdr
z wymogiem jest, że zachowują się one jako pary, ponieważ wspomnieli.
Powodem pominięcia w tej definicji słów "odniesienie", "wskaźnik" itd. Jest uznanie, że są to szczegóły dotyczące implementacji. Jeśli chcesz, możesz zbudować cons
z powietrza, jak Abelson i Sussman zrobił:
(define (cons a b) (lambda (x) (x a b)))
(define (car x) (x (lambda (a b) a)))
(define (cdr x) (x (lambda (a b) b)))
Definicja ta żyje całkowicie wewnątrz świata Lisp w definicji i funkcji, a nawet nie zatrzymać do rozważenia, czy obiekty są przechowywane jako wartości lub odniesienia; jednak mogą one służyć jako zamienniki zastępcze dla obiektów pierwotnych (nie biorąc pod uwagę zmienności lub innych specjalnych zastosowań).
- 1. Jaka jest definicja HTTP_X_PURPOSE?
- 2. Jaka jest dokładna definicja interpretera metakirycznego?
- 3. Perl: Jaka jest definicja testu?
- 4. Jaka jest definicja "starszego kodu"?
- 5. Jaka jest różnica między Lisp-1 i Lisp-2?
- 6. Jaka jest definicja _Rb_tree_increment w bits/stl_tree.h?
- 7. jaka jest definicja typu NU dla ogólnej procedury?
- 8. jaka jest definicja parametru "verbose" w scikit learn klastry kmeans
- 9. Definicja obiektu na 2 sposoby - jaka jest różnica?
- 10. Jaka jest różnica między procedurą i procedurą # 'w Lisp/Clojure?
- 11. W Lisp (Clojure, Emacs Lisp), jaka jest różnica między listą a ofertą?
- 12. LISP przeciw w pytonie
- 13. Typeclasses we wspólnym Lisp
- 14. Lista bez zera w Lisp
- 15. Co to jest definicja ([, funkcja]) w JavaScript?
- 16. Co to jest definicja "widoku" na CSS?
- 17. Jak to zrobić ((AB) (CD).) W LISP
- 18. W jaki sposób Stream-cons # :: jest tłumaczony w Scali?
- 19. Gdzie jest definicja struktury _TP_POOL?
- 20. Definicja funkcji lub definicja zmiennej?
- 21. Jak działa definicja "apply-partial" w Emacs 24?
- 22. Definicja końca strony a definicja końca strony
- 23. Common Lisp definicji pakietu
- 24. Pomoc w wyjaśnieniu, jak działa "cons" w schemacie?
- 25. Co to jest konwencja dotycząca rozszerzenia pliku Lisp?
- 26. Dlaczego SML i OCaml są uważane za dialekty ML? Jaka jest definicja ML?
- 27. Jaka jest prawidłowa definicja urządzenia dla Google Glass (dla symulatora w Eclipse lub Android Studio)?
- 28. Jaka jest poprawna definicja usługi ekspresu do kawy LE LE (Smart)?
- 29. Java 9 nie jest wyjątkiem definicja klasy
- 30. emacs: Definicja funkcji symbolu jest nieważna: pętla
każda lista (z wyjątkiem 'nil') jest komórką cons, ale nie każda komórka cons jest listą (jeśli jej' cdr' nie jest listą) – mihi
Chciałem tylko wyjaśnić, że porównuję powyższe zdanie pomiędzy Common Lisp Lista i jej Komórki oraz regularna Lisnked Lista i jej Elementy zaimplementowane w języku takim jak C, C++ lub Java. –