Οι πίνακες κατακερματισμού στην Common Lisp είναι δομές δεδομένων για την αποθήκευση συσχετιστικών δεδομένων. Αντιστοιχίζουν κλειδιά (που μπορεί να είναι οποιοδήποτε αντικείμενο) σε τιμές (που μπορεί επίσης να είναι οποιοδήποτε αντικείμενο). Άλλες γλώσσες μπορεί να αναφέρονται σε αυτή την έννοια ως χάρτες, λεξικά ή κατακερματισμούς.
Οι πίνακες κατακερματισμού μπορούν να δημιουργηθούν με τη συνάρτηση make-hash-table.
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(Σημείωσε ότι η εκτυπωμένη μορφή ενός πίνακα κατακερματισμού εξαρτάται από την υλοποίηση, οπότε μπορεί να εμφανιστεί διαφορετικά στο REPL σου.)
Για να πάρεις μια τιμή με βάση ένα κλειδί από τον πίνακα κατακερματισμού, χρησιμοποιείς τη συνάρτηση gethash:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
Το gethash επιστρέφει πολλαπλές τιμές, οι οποίες θα εξηγηθούν σε άλλη ενότητα.
Για να εισάγεις μια τιμή σε έναν πίνακα κατακερματισμού, χρησιμοποιείς το setf μαζί με το gethash, όπως εδώ:
(setf (gethash :foo *hash-table*) :bar) : => :bar
Αυτό θα αλλάξει την τιμή για το κλειδί :foo στον πίνακα κατακερματισμού *hash-table* σε :bar.
Επιστρέφει την τιμή.
Η χρήση του setf θα εξηγηθεί σε άλλη ενότητα.
Ο Lamont είναι ένας εξωγήινος από τη Lisp που θέλει να γράψει το δικό του βιντεοπαιχνίδι. Ένα από τα πράγματα για τα οποία σου ζήτησε βοήθεια είναι να κρατάς μια λίστα με τις υψηλές βαθμολογίες.
Όρισε μια συνάρτηση make-high-score-table που δεν παίρνει κανένα όρισμα και αποτιμάται σε έναν νέο κενό πίνακα κατακερματισμού:
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
Για να προσθέσεις έναν παίκτη στον πίνακα, όρισε μια συνάρτηση add-player που παίρνει δύο ορίσματα:
Όρισε την αρχική βαθμολογία του παίκτη σε μηδέν.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
Για να ορίσεις τη βαθμολογία ενός παίκτη, όρισε μια συνάρτηση set-score που παίρνει τρία ορίσματα:
(set-score hash-table :louis 1234) ; => 1234
Για να πάρεις τη βαθμολογία ενός παίκτη από τον πίνακα, όρισε μια συνάρτηση get-score που παίρνει δύο ορίσματα:
Αυτή η συνάρτηση θα πρέπει να αποτιμάται στη βαθμολογία που είναι αποθηκευμένη για τον παίκτη.
Αν δεν υπάρχει αποθηκευμένη βαθμολογία για αυτόν τον παίκτη ή ο παίκτης δε βρίσκεται ακόμα στον πίνακα, τότε να αποτιμάται σε 0.
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
Για να αφαιρέσεις έναν παίκτη από τον πίνακα υψηλών βαθμολογιών, όρισε μια συνάρτηση remove-player που παίρνει δύο ορίσματα:
Αυτή η συνάρτηση θα πρέπει να χειρίζεται ομαλά τις περιπτώσεις όπου ο παίκτης δεν έχει προστεθεί ακόμα στον πίνακα. Προφανώς, αφού αφαιρεθεί ένας παίκτης, αν πάρεις τη βαθμολογία του από τον πίνακα, θα είναι μηδέν.
(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
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Common Lisp με 27 έννοιες92 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.