LISP - Listy
Listy były najważniejszą i podstawową strukturą danych złożonych w tradycyjnym LISP-ie. Współczesny Common LISP zapewnia inne struktury danych, takie jak wektor, tablica mieszająca, klasy lub struktury.
Listy to pojedyncze połączone listy. W LISP-ie listy są konstruowane jako łańcuch o prostej strukturze rekordów o nazwiecons połączone ze sobą.
Wady Struktura rekordu
ZA cons jest strukturą rekordu zawierającą dwa komponenty zwane car i cdr.
Wady komórki lub wady to obiekty to pary wartości, które są tworzone za pomocą funkcji cons.
Plik consfunkcja przyjmuje dwa argumenty i zwraca nową komórkę cons zawierającą dwie wartości. Te wartości mogą być odniesieniami do dowolnego rodzaju obiektu.
Jeśli druga wartość nie jest zerem ani nie jest inną komórką wad, wówczas wartości są drukowane jako para z kropkami ujęta w nawiasy.
Dwie wartości w komórce wad nazywane są car i cdr. Plik car funkcja służy do uzyskania dostępu do pierwszej wartości i cdr funkcja służy do uzyskania dostępu do drugiej wartości.
Przykład
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(write (cons 1 2))
(terpri)
(write (cons 'a 'b))
(terpri)
(write (cons 1 nil))
(terpri)
(write (cons 1 (cons 2 nil)))
(terpri)
(write (cons 1 (cons 2 (cons 3 nil))))
(terpri)
(write (cons 'a (cons 'b (cons 'c nil))))
(terpri)
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(terpri)
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))
Po wykonaniu kodu zwraca następujący wynik -
(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)
Powyższy przykład pokazuje, w jaki sposób struktury wad mogą zostać użyte do utworzenia pojedynczej listy połączonej, np. Lista (ABC) składa się z trzech komórek wad połączonych ze sobą swoimi cdrs .
Schematycznie można to wyrazić jako -
Listy w LISP
Chociaż komórki wad mogą być używane do tworzenia list, jednak konstruowanie listy z zagnieżdżonej conswywołania funkcji nie mogą być najlepszym rozwiązaniem. Pliklist Funkcja służy raczej do tworzenia list w LISP-ie.
Funkcja listy może przyjmować dowolną liczbę argumentów i ponieważ jest funkcją, oblicza jej argumenty.
Plik first i restfunkcje podają pierwszy element i pozostałą część listy. Poniższe przykłady przedstawiają koncepcje.
Przykład 1
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(write (list 1 2))
(terpri)
(write (list 'a 'b))
(terpri)
(write (list 1 nil))
(terpri)
(write (list 1 2 3))
(terpri)
(write (list 'a 'b 'c))
(terpri)
(write (list 3 4 'a (car '(b . c)) (* 4 -2)))
(terpri)
(write (list (list 'a 'b) (list 'c 'd 'e)))
Po wykonaniu kodu zwraca następujący wynik -
(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))
Przykład 2
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(defun my-library (title author rating availability)
(list :title title :author author :rating rating :availabilty availability)
)
(write (getf (my-library "Hunger Game" "Collins" 9 t) :title))
Po wykonaniu kodu zwraca następujący wynik -
"Hunger Game"
Lista funkcji manipulujących
W poniższej tabeli przedstawiono niektóre często używane funkcje służące do obsługi list.
Sr.No. | Opis funkcji |
---|---|
1 | car Pobiera listę jako argument i zwraca jej pierwszy element. |
2 | cdr Pobiera listę jako argument i zwraca listę bez pierwszego elementu |
3 | cons Pobiera dwa argumenty, element i listę i zwraca listę z elementem wstawionym na pierwszym miejscu. |
4 | list Pobiera dowolną liczbę argumentów i zwraca listę z argumentami jako elementami składowymi listy. |
5 | append Łączy dwie lub więcej list w jedną. |
6 | last Pobiera listę i zwraca listę zawierającą ostatni element. |
7 | member Pobiera dwa argumenty, z których drugi musi być listą, jeśli pierwszy argument jest członkiem drugiego argumentu, a następnie zwraca pozostałą część listy, zaczynając od pierwszego argumentu. |
8 | reverse Pobiera listę i zwraca listę z pierwszymi elementami w odwrotnej kolejności. |
Należy pamiętać, że wszystkie funkcje sekwencji mają zastosowanie do list.
Przykład 3
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(write (car '(a b c d e f)))
(terpri)
(write (cdr '(a b c d e f)))
(terpri)
(write (cons 'a '(b c)))
(terpri)
(write (list 'a '(b c) '(e f)))
(terpri)
(write (append '(b c) '(e f) '(p q) '() '(g)))
(terpri)
(write (last '(a b c d (e f))))
(terpri)
(write (reverse '(a b c d (e f))))
Po wykonaniu kodu zwraca następujący wynik -
A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)
Łączenie funkcji Car i CDR
Plik car i cdr funkcje i ich kombinacja pozwala na wyodrębnienie dowolnego elementu / członka listy.
Jednak sekwencje funkcji car i cdr można skrócić, łącząc literę a dla car id dla cdr wewnątrz liter c i r.
Na przykład możemy napisać cadadr, aby skrócić sekwencję wywołań funkcji - car cdr car cdr.
Zatem (cadadr '(a (cd) (efg))) zwróci d
Przykład 4
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(write (cadadr '(a (c d) (e f g))))
(terpri)
(write (caar (list (list 'a 'b) 'c)))
(terpri)
(write (cadr (list (list 1 2) (list 3 4))))
(terpri)
Po wykonaniu kodu zwraca następujący wynik -
D
A
(3 4)