Μια λίστα στη Gleam είναι μια αμετάβλητη συλλογή από μηδέν ή περισσότερες τιμές. Όλες οι τιμές σε μια λίστα πρέπει να έχουν τον ίδιο τύπο. Επειδή οι λίστες είναι αμετάβλητες, μόλις κατασκευαστεί μια λίστα, η τιμή της δεν μπορεί ποτέ να αλλάξει. Οποιεσδήποτε συναρτήσεις ή τελεστές φαίνεται να τροποποιούν μια λίστα (όπως η προσθήκη ενός στοιχείου), στην πραγματικότητα επιστρέφουν μια νέα λίστα.
Οι λίστες μπορούν να οριστούν ως εξής:
let empty = []
let singleValue = [5]
let threeValues = ["a", "b", "c"]
Ο πιο συνηθισμένος τρόπος για να προσθέσεις ένα στοιχείο σε μια λίστα είναι μέσω της σύνταξης επέκτασης:
let two_to_four = [2, 3, 4]
let one_to_four = [1, ..two_to_four]
// -> [1, 2, 3, 4]
Το module gleam/list της βασικής βιβλιοθήκης του Gleam περιέχει πολλές χρήσιμες συναρτήσεις για να δουλεύεις με λίστες. Αυτό το module χρησιμοποιείται πολύ συχνά στον κώδικα Gleam, οπότε είναι καλό να εξοικειωθείς μαζί του.
Τα μοτίβα λιστών μπορούν να χρησιμοποιηθούν σε εκφράσεις case για να αντιστοιχίσεις λίστες και να εκχωρήσεις τις τιμές που περιέχουν σε μεταβλητές:
pub fn describe(list: List(String)) -> String {
case list {
[] -> "Empty list"
[x] -> "List with one item: " <> x
[x, y] -> "List with two items: " <> x <> " and " <> y
_ -> "List with three or more items"
}
}
Εκτός από την αντιστοίχιση λιστών με ακριβές μήκος, η σύνταξη επέκτασης μπορεί να χρησιμοποιηθεί για να αντιστοιχίσεις λίστες που έχουν τουλάχιστον ένα συγκεκριμένο μήκος:
pub fn describe(list: List(String)) -> String {
case list {
[_, _, ..] -> "List with at least two items"
[_] -> "List with one item"
[] -> "Empty list"
}
}
Η σύνταξη επέκτασης μπορεί επίσης να χρησιμοποιηθεί για να εκχωρήσεις το υπόλοιπο της λίστας σε μια μεταβλητή:
pub fn remove_first_item(list: List(String)) -> List(String) {
case list {
// Return the list without the first item
[_, ..rest] -> rest
// There's no first item to remove, return an empty list
_ -> []
}
}
Οι εκφράσεις case πρέπει να έχουν ένα μοτίβο για κάθε πιθανή τιμή του τύπου πάνω στον οποίο γίνεται η αντιστοίχιση, οπότε συχνά χρησιμοποιείται ένα τελικό μοτίβο απόρριψης (_) για να καλύπτει τις υπόλοιπες τιμές.
Σε αυτή την άσκηση θα γράψεις κώδικα για να κρατάς μια λίστα με τις γλώσσες προγραμματισμού που θέλεις να μάθεις στο Exercism.
Έχεις έξι εργασίες, που όλες τους έχουν να κάνουν με λίστες.
Για να κρατάς λίστα με τις γλώσσες που θέλεις να μάθεις, θα χρειαστεί να δημιουργήσεις μια νέα λίστα. Όρισε τη συνάρτηση new_list που επιστρέφει μια νέα, κενή λίστα.
new_list()
// -> []
Αυτή τη στιγμή, έχεις ένα χαρτί όπου είναι γραμμένες οι γλώσσες που θέλεις να μάθεις: Gleam, Go και TypeScript. Όρισε τη συνάρτηση existing_list ώστε να επιστρέφει αυτή τη λίστα.
existing_list()
// -> ["Gleam", "Go", "TypeScript"]
Καθώς εξερευνάς το Exercism και βρίσκεις πιο ενδιαφέρουσες γλώσσες, θέλεις να τις προσθέτεις στη λίστα σου. Υλοποίησε τη συνάρτηση add_language για να προσθέτεις μια νέα γλώσσα στην αρχή της λίστας σου.
add_language(["OCaml", "Elixir"], "Scheme")
// -> ["Scheme", "OCaml", "Elixir"]
Το να μετράς τις γλώσσες μία προς μία δεν είναι βολικό. Υλοποίησε τη συνάρτηση count_languages για να μετράς το πλήθος των γλωσσών στη λίστα σου.
count_languages(["jq", "Elm", "Rust", "Kotlin"])
// -> 4
Κάποια στιγμή, συνειδητοποιείς ότι η λίστα σου είναι στην πραγματικότητα με αντίστροφη σειρά! Υλοποίησε τη συνάρτηση reverse_list για να αντιστρέψεις τη λίστα σου.
reverse_list(["Python", "Julia", "Idris", "COBOL"])
// -> ["COBOL", "Idris", "Julia", "Python"]
Αν και αγαπάς όλες τις γλώσσες, η Gleam έχει ξεχωριστή θέση στην καρδιά σου. Έτσι, ενθουσιάζεσαι πραγματικά με μια λίστα γλωσσών αν:
Υλοποίησε τη συνάρτηση exciting_list για να ελέγχεις αν μια λίστα γλωσσών είναι συναρπαστική:
exciting_list(["Lua", "Gleam"])
// -> True
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Gleam με 33 έννοιες122 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.