DedSec Project

racket — συγκεντρωτικός οδηγός — DedSec Project

racket — συγκεντρωτικός οδηγός Racket Έννοια Η Racket υποστηρίζει συναρτησιακό προγραμματισμό, macros, modules και contracts με ιδιαίτερη έμφαση στη σχεδίαση γλωσσών. Παράδειγμα πηγαίου…

Racket

Έννοια

Η Racket υποστηρίζει συναρτησιακό προγραμματισμό, macros, modules και contracts με ιδιαίτερη έμφαση στη σχεδίαση γλωσσών.

Παράδειγμα πηγαίου κώδικα ή χρήσης

#lang racket
(define (square x) (* x x))
(displayln (square 5))

Άσκηση με συγκεκριμένο στόχο

Πρόβλεψε την έξοδο και πρόσθεσε predicate ή contract για απόρριψη μη αριθμητικών τιμών.

Έλεγχος και διάγνωση

Μια quoted λίστα είναι δεδομένα, όχι πρόγραμμα που εκτελείται αυτόματα· ξεχώρισε τα πριν από macros.

Σημείωσε την είσοδο, το αναμενόμενο αποτέλεσμα και το πραγματικό αποτέλεσμα στην εγκατεστημένη έκδοση της Racket. Αν ο κώδικας δεν είναι προσβάσιμος από το κινητό, κράτησε το παράδειγμα ως μη δοκιμασμένο και εξήγησε τη σημασιολογία αντί να ισχυριστείς επιτυχία. Κάνε μια δεύτερη δοκιμή που απομονώνει μόνο τον μηχανισμό της άσκησης και κράτησε ακριβές σφάλμα με τρόπο που να μην εκθέτει προσωπικά δεδομένα.

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

Αυτοτελές εκτελέσιμο αρχείο

Το #lang ορίζει ποια γλώσσα και ποιες βιβλιοθήκες χρησιμοποιούνται. Δημιούργησε sum-list.rkt:

#lang racket
(require rackunit)
(define (sum-list xs)
  (cond [(empty? xs) 0]
        [else (+ (first xs) (sum-list (rest xs)))]))
(check-equal? (sum-list '()) 0)
(check-equal? (sum-list '(1 2 3)) 6)
(check-equal? (sum-list '(-2 5)) 3)
(displayln "checks passed")

Η εντολή racket sum-list.rkt αναμένεται να τυπώσει checks passed όταν όλες οι συνθήκες ισχύουν. Σε αποτυχημένο assertion εμφανίζεται σφάλμα. Κάθε αναδρομική κλήση επεξεργάζεται το υπόλοιπο της λίστας έως ότου φτάσει στην κενή λίστα. Δεν έχει πραγματοποιηθεί εκτέλεση Racket στο παρόν περιβάλλον.

Τερματισμός και βασική περίπτωση

Εξήγησε γιατί η (rest xs) μικραίνει μία πεπερασμένη λίστα και γιατί η empty? πρέπει να ελέγχεται πριν από τη first. Σε προσωρινό αντίγραφο αφαίρεσε τη βασική περίπτωση και παρατήρησε το σφάλμα που προκύπτει. Αυτό δεν αποδεικνύει ότι κάθε αναδρομή είναι προβληματική: αποδεικνύει ότι η συνάρτηση έχασε το συμβόλαιο τερματισμού και το όριο του πεδίου της.

Σφάλμα τύπου δεδομένων

Δοκίμασε (sum-list '(1 "two")). Ο τελεστής + δεν μπορεί να αθροίσει αυθαίρετο κείμενο. Φύλαξε την πραγματική διάγνωση και αποφάσισε αν η συνάρτηση θα δέχεται μόνο αριθμούς, θα ελέγχει τα στοιχεία εκ των προτέρων ή θα επιστρέφει δομημένη αποτυχία. Η σιωπηλή αντικατάσταση λάθος τιμών με μηδέν καταστρέφει πληροφορία.

Σύγκριση υλοποιήσεων

Φτιάξε ισοδύναμη άσκηση με (apply + xs) ή for/sum και έλεγξε κενή λίστα και αρνητικές τιμές. Σύγκρινε κόστος αναδρομής και τρόπο αξιολόγησης, όχι μόνο τον αριθμό γραμμών. Πρόσθεσε (check-exn exn:fail? (lambda () (sum-list '(1 "two")))) ώστε η σκόπιμη αποτυχία να ελέγχεται. Κατάγραψε έκδοση Racket. Αναφορά: https://docs.racket-lang.org/rackunit/