Tekintve, hogy a nyelv, amit használunk, a Lisp, a LIST Processing rövidítése, könnyen azt feltételezhetnéd, hogy a nyelv rendelkezik a listák kezeléséhez szükséges eszközökkel. És igazad is lenne!
Bár a Common Lisp a listákon kívül más adatszerkezeteket is kínál, a listák használata továbbra is igen elterjedt.
A Common Lispben a lista elemek sorozata. A neve cons is (többnyire történelmi okokból).
Maguk az elemek nem feltétlenül azonos típusúak.
Például lehet egy listád, amely 1, two és "III" elemeket tartalmaz.
Egyszerűen beírhatsz egy idézőjeles listát, például így: '(1 two "III"), és ezzel létrehozol és kiértékelsz egy listát (az értéke (1 two "III") lesz).
Emellett két fő függvény szolgál a listák létrehozására: a list és a cons.
A list nulla vagy több argumentumot vesz át, és az értéke egy olyan lista lesz, amelyet ezekből az értékekből hozott létre:
(list 1 'two "III") ; => (1 two "III")
A cons két elemet vesz át, és olyan listát hoz létre, amelynek az első elem a car-ja (a lista feje), a második pedig a cdr-je (a lista többi része):
(cons 1 2) ; => (1 . 2) ;; (a list without `nil` as its `cdr` is printed in this way)
(cons 1 nil) ; => (1)
(cons 1 (cons 2 nil)) ; => (1 2)
A car és a cdr függvénnyel hozzáférhetsz egy lista car-jához és cdr-jéhez.
(A first és a rest a car és a cdr szinonimája, és pontosan ugyanúgy működnek.)
Egy lista hosszát a length segítségével állapíthatod meg.
Az üres lista hossza nulla.
Egy tetszőleges elemhez az nth segítségével férhetsz hozzá (figyelem: a listák indexelése nullától indul).
Nem hiba olyan indexet kérni, amely nagyobb, mint amilyen hosszú a lista.
Ehelyett az értéke nil lesz:
(nth 23 '(short list)) ; => nil
Emellett több segédfüggvény is létezik egy lista első elemeihez való hozzáféréshez: first, second, third, egészen tenth-ig. Menő, mi?
Két vagy több listát az append segítségével fűzhetsz össze:
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()) ; => (A B C)
Az append-nek átadott minden argumentumnak listának kell lennie.
Leslie-nek, a Lisp-űrlénynek bevásárolnia kell. Nagyon fontos, hogy legyen bevásárlólistája. Az ember hozzáad dolgokat, és levesz róla.
Persze egy Lisp-űrlénynek nem elég a papír meg a toll. Ráadásul a „list” szó a „Lisp” szó nagy része! Biztosan meg kell írni néhány függvényt, amelyek segítenek nyilván tartani a bevásárlást.
Segítesz Leslie-nek nyilván tartani a bevásárlólistát?
Először is Leslie-nek létre kell hoznia egy üres listát. Erre tökéletes lenne egy new-list nevű függvény.
(new-list) ; => ()
Jaj, ne... Leslie-nek már most eszébe jutott néhány dolog, ezért kell neki egy függvény, amely három elemet vesz át (szerencsére Leslie mindig csak három elemből álló listát készít. Se többet, se kevesebbet!), és ezekből új bevásárlólistát hoz létre. Írj egy list-of-things függvényt, amely három elemet vesz át, és visszaad belőlük egy listát.
(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)
Mielőtt elindul a boltba, Leslie átnézi a kamrát, hogy lássa, mire van szüksége. Segíts neki egy add-to-list függvény megírásával, amely hozzáad egy elemet a lista elejéhez.
(add-to-list 'butter '(bread)) ; => '(butter bread)
Vásárlás közben Leslie szeretné tudni, hogy mi után nézzen legközelebb. Szeret előre belepillantani a listába, hogy lássa a második, a harmadik, sőt a huszonharmadik elemet is (ez a szerencseszáma).
first-thing a lista első elemét adja visszasecond-thing a másodikatthird-thing a harmadikattwenty-third-thing a huszonharmadikat(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk
Leslie megkeresi a lista első elemét, és leveszi a polcról.
Segíts neki egy remove-first-item függvény megírásával, amely a bemeneti lista minden elemét visszaadja, kivéve az elsőt.
(remove-first-item '(bread butter milk)) ; => '(butter milk)
Leslie rájött, hogy véletlenül két bevásárlólistát készített egy helyett! Írj egy list-append függvényt, amely olyan listát ad vissza, amelyben az első lista elemeit a második lista elemei követik.
(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)
Leslie kezd aggódni, hogy ez a bevásárlás elhúzódik. Hány dolog is van ezen a listán? Írj egy just-how-long függvényt, amely megmondja, milyen hosszú a listája.
(just-how-long '(bread milk butter salt)) ; => 4
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Common Lisp nyelvet 27 fogalom92 feladat segítségével, valódi emberi mentorálással, mindez ingyen.