common_lisp — συγκεντρωτικός οδηγός — DedSec Project
common_lisp — συγκεντρωτικός οδηγός Common Lisp Βασική ιδέα Η Common Lisp είναι πολυπαραδειγματική Lisp με macros, packages και condition system. Μικρό εκπαιδευτικό απόσπασμα Άσκηση…
Common Lisp
Βασική ιδέα
Η Common Lisp είναι πολυπαραδειγματική Lisp με macros, packages και condition system.
Μικρό εκπαιδευτικό απόσπασμα
(defun double (n) (* n 2))
(double 5)
Άσκηση βασισμένη στη συγκεκριμένη συμπεριφορά
Σύγκρινε quoted form με εκτέλεση double και φτιάξε συνάρτηση για λίστα αριθμών.
Διάγνωση και όρια
Τα package symbols και οι lexical variables είναι διαφορετικές έννοιες· απόφυγε συγκρούσεις.
Κάνε την άσκηση με πραγματικά δοκιμαστικά δεδομένα και με έκδοση Common_Lisp που ταιριάζει στον κώδικα. Σημείωσε μία αρχική πρόβλεψη και την πραγματική έξοδο. Για περίπλοκο ή μη διαθέσιμο runtime, παρουσίασε τη στατική ανάλυση ως τέτοια, όχι ως επιτυχημένη εκτέλεση. Δοκίμασε ξεχωριστά την κανονική περίπτωση και μία οριακή τιμή, χωρίς πραγματικά προσωπικά ή παραγωγικά δεδομένα.
Common_Lisp — Αναλυτικός οδηγός εξάσκησης
Τιμή και σήμα ύπαρξης
Στην Common Lisp η car πάνω σε NIL επιστρέφει NIL. Αν χρησιμοποιήσεις μόνο NIL ως ένδειξη κενού, μπορεί να το μπερδέψεις με νόμιμο πρώτο στοιχείο NIL. Δύο τιμές επιστροφής λύνουν το πρόβλημα:
(defun safe-first (items)
(if (consp items)
(values (car items) t)
(values nil nil)))
(multiple-value-bind (item present) (safe-first '(10 20))
(assert (and present (= item 10))))
(multiple-value-bind (item present) (safe-first nil)
(assert (and (null item) (not present))))
(format t "checks passed~%")
Δοκίμασε σε Common Lisp, όπως SBCL, και σημείωσε έκδοση. Αναμένεται checks passed. Οι values και multiple-value-bind είναι ιδιαίτεροι μηχανισμοί της γλώσσας, όχι απλά στοιχεία λίστας. Σύγκρινε με κλήση που χρησιμοποιεί μόνο την κύρια τιμή επιστροφής.
Γιατί το nil δεν σημαίνει πάντα απουσία
Έλεγξε (safe-first '(nil 5)). Η πρώτη επιστροφή πρέπει να είναι NIL, αλλά η δεύτερη ένδειξη ύπαρξης να είναι αληθής. Ο καλών που αγνοεί τη δεύτερη τιμή μπορεί να συμπεράνει λανθασμένα ότι η λίστα ήταν κενή. Πρόκειται για διαφορετικό συμβόλαιο από μία συλλογή κειμένων όπου το άδειο string είναι κανονική τιμή.
Σκόπιμο σφάλμα τύπων
Εκτέλεσε (+ "2" 3) σε απομονωμένο REPL και φύλαξε την πραγματική διάγνωση τύπου. Μην υποθέσεις ότι κάθε υλοποίηση εμφανίζει ίδια debugger restarts ή interactive prompts. Διόρθωσε την αιτία της ασυμφωνίας χωρίς αυθαίρετη μετατροπή όλων των τιμών σε συμβολοσειρές.
Αυτόνομη επέκταση
Υλοποίησε safe-last που ξεχωρίζει άδεια σωστή λίστα από λίστα με τελευταίο στοιχείο NIL. Δοκίμασε (), (1 2) και (1 nil). Εξήγησε τη διαφορά ανάμεσα στο listp και στον έλεγχο ύπαρξης cons. Σε δεύτερη συνάρτηση διερεύνησε optional/keyword parameters. Αναφορά: https://www.lispworks.com/documentation/HyperSpec/Front/