A hashtáblák a Common Lispben asszociatív adatok tárolására szolgáló adatszerkezetek. A kulcsokat (amelyek bármilyen objektumok lehetnek) értékekhez rendelik (amelyek szintén bármilyen objektumok lehetnek). Más nyelvekben ezt a fogalmat map, szótár vagy hash néven ismerheted.
Hashtáblát a make-hash-table függvénnyel hozhatsz létre.
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(Figyeld meg, hogy a hashtábla kiírt formája implementációfüggő, ezért a te REPL-edben máshogy nézhet ki.)
Ha egy kulcshoz tartozó értéket szeretnél kiolvasni a hashtáblából, a gethash függvényt használod:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
A gethash több értéket ad vissza, amit egy másik fogalomban magyarázunk el.
Ha értéket szeretnél beszúrni egy hashtáblába, a setf-et a gethash-sal együtt használod, így:
(setf (gethash :foo *hash-table*) :bar) : => :bar
Ez a *hash-table* hashtáblában a :foo kulcshoz tartozó értéket :bar-ra módosítja.
Az értéket adja vissza.
A setf használatát egy másik fogalomban magyarázunk el.
Lamont egy Lisp-űrlény, aki a saját videojátékát szeretné megírni. Az egyik feladat, amelyben a segítségedet kéri, a csúcspontszám-lista vezetése.
Definiálj egy make-high-score-table nevű függvényt, amely nem fogad argumentumot, és egy új, üres hash-táblázatra értékelődik ki:
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
Ha játékost szeretnél hozzáadni a táblázathoz, definiálj egy add-player nevű függvényt, amely két argumentumot vár:
Állítsd a játékos kezdő pontszámát nullára.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
Ha be szeretnéd állítani egy játékos pontszámát, definiálj egy set-score nevű függvényt, amely három argumentumot vár:
(set-score hash-table :louis 1234) ; => 1234
Ha le szeretnéd kérdezni egy játékos pontszámát a táblázatból, definiálj egy get-score nevű függvényt, amely két argumentumot vár:
Ez a függvény a játékoshoz tárolt pontszámra értékelődjön ki.
Ha ehhez a játékoshoz nincs tárolt pontszám, vagy a játékos még nincs benne a táblázatban, akkor az érték 0 legyen.
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
Ha el szeretnél távolítani egy játékost a csúcspontszám-táblázatból, definiálj egy remove-player nevű függvényt, amely két argumentumot vár:
Ennek a függvénynek gördülékenyen kell kezelnie azt az esetet, amikor a játékost még nem adták hozzá a táblázathoz. Nyilvánvaló, hogy miután egy játékost eltávolítottunk, ha lekérdezzük a pontszámát a táblázatból, az nulla lesz.
(set-score hash-table :louis 1234) ; => 1234
(remove-player hash-table :louis) ; => T
(get-score hash-table :louis) ; => 0
(remove-player hash-table :not-in-the-table) ; => NIL
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.