DedSec Project

Clojure — οδηγός συναρτησιακού προγραμματισμού — DedSec Project

Clojure — οδηγός συναρτησιακού προγραμματισμού Clojure Βασική ιδέα Η Clojure βασίζεται σε persistent data structures, pure transformations και ελεγχόμενο state στην JVM. Μικρό εκπαιδευτικό…

Clojure

Βασική ιδέα

Η Clojure βασίζεται σε persistent data structures, pure transformations και ελεγχόμενο state στην JVM.

Μικρό εκπαιδευτικό απόσπασμα

(reduce + [1 2 3 4])

Άσκηση βασισμένη στη συγκεκριμένη συμπεριφορά

Σύγκρινε map/reduce και επιβεβαίωσε ότι conj επιστρέφει νέα συλλογή χωρίς μεταβολή αρχικής.

Διάγνωση και όρια

Το laziness αναβάλλει ενέργειες· μην βασίζεις side effects σε μη αξιολογημένα sequences.

Κάνε την άσκηση με πραγματικά δοκιμαστικά δεδομένα και με έκδοση Clojure που ταιριάζει στον κώδικα. Σημείωσε μία αρχική πρόβλεψη και την πραγματική έξοδο. Για περίπλοκο ή μη διαθέσιμο runtime, παρουσίασε τη στατική ανάλυση ως τέτοια, όχι ως επιτυχημένη εκτέλεση. Δοκίμασε ξεχωριστά την κανονική περίπτωση και μία οριακή τιμή, χωρίς πραγματικά προσωπικά ή παραγωγικά δεδομένα.

Clojure — Αναλυτικός οδηγός εξάσκησης

Μετασχηματισμός μικρής ακολουθίας

Οι συλλογές Clojure διατηρούνται αμετάβλητες· οι πράξεις παράγουν νέες τιμές. Σε προσωρινό REPL ή αρχείο .clj γράψε:

(require '[clojure.string :as str])
(def names [" Ada " "ada" "Lin"])
(def counts (frequencies (map (comp str/lower-case str/trim) names)))
(println counts)
(assert (= {"ada" 2, "lin" 1} counts))

Ο αναμενόμενος χάρτης μετρά δύο φορές την Ada και μία τη Lin. Η comp συνθέτει κανονικοποιήσεις, η map εφαρμόζει τον μετασχηματισμό με τεμπέλικη αξιολόγηση και η frequencies συγκεντρώνει εμφανίσεις. Η σειρά εκτύπωσης των κλειδιών δεν είναι συμβόλαιο· έλεγξε συσχετισμούς κλειδιού-τιμής, όχι απλώς το κείμενο.

Σκόπιμα λανθασμένη είσοδος

Πρόσθεσε nil στα ονόματα και εξέτασε τι κάνει η str/trim. Η συλλογή δεν γίνεται αυτομάτως ασφαλής για οποιονδήποτε τύπο επειδή οι αρχικές τιμές ήταν strings. Όρισε ρητά πολιτική εισαγωγής: απόρριψη, αγνόηση ή ειδική αναπαράσταση. Μην καλύπτεις την ασυμφωνία με αυθαίρετη μετατροπή κάθε αντικειμένου σε κείμενο.

Νέα τιμή ή αλλαγή αναφοράς;

Εκτέλεσε (assoc counts "lin" 3) και επαλήθευσε ότι η αρχική counts παραμένει με τιμή 1 για το συγκεκριμένο κλειδί. Το def μπορεί να αλλάξει τη δέσμευση ενός Var, αλλά δεν μεταλλάσσει τον αρχικό persistent map. Η διάκριση βοηθά στην κατανόηση κοινής κατάστασης και παράλληλου κώδικα.

Ανεξάρτητη επέκταση

Σύγκρινε μετρήσεις που διακρίνουν ή αγνοούν πεζά/κεφαλαία. Έλεγξε (get counts "missing" 0) και σύγκρινέ το με (get counts "missing"), όπου δεν υπάρχει ρητή προεπιλογή. Πρόσθεσε κενή είσοδο και διπλές τιμές. Εξήγησε γιατί μια τεμπέλικη ακολουθία μπορεί να μεταθέσει το σφάλμα έως ότου αξιολογηθεί. Σημείωσε εκδόσεις Clojure/JVM. Αναφορές: https://clojure.org/guides/learn/sequences και https://clojure.github.io/clojure/clojure.core-api.html

Clojure — Διαδρομή ουσιαστικής εξάσκησης

Πρακτικές εργασίες

  1. Σύνθεσε δύο καθαρές συναρτήσεις και εξήγησε τους τύπους τους.
  2. Μετασχημάτισε λίστα με map/filter/fold ή αντίστοιχες πράξεις.
  3. Σύγκρινε αμετάβλητη κατάσταση με κρυφή μεταβολή.

Ερωτήσεις ουσίας