Διαδρομές
/
Factor
Factor
/
Ασκήσεις
/
Ασφάλεια εργοστασίου
Ασφάλεια εργοστασίου

Ασφάλεια εργοστασίου

Άσκηση εκμάθησης

Εισαγωγή

Το σύστημα σφαλμάτων της Factor έχει τρία μέρη: throw για να πετάξεις ένα σφάλμα, recover για να χειριστείς ένα, και ERROR: για να ορίσεις το δικό σου είδος σφάλματος.

throw

Το throw (στο kernel) πετάει ένα σφάλμα. Το όρισμα μπορεί να είναι οποιαδήποτε τιμή, είτε συμβολοσειρά, είτε αριθμός, είτε tuple, και γίνεται το σφάλμα που μπορείς να εξετάσεις αργότερα:

! DOCTEST: SKIP
"file not found" throw

Το throw δεν επιστρέφει· η υπόλοιπη τρέχουσα λέξη παραλείπεται.

recover

Το recover (στο continuations) είναι το try/catch της Factor. Παίρνει ένα try quotation και ένα recovery quotation:

recover ( try recovery -- )

Αν το try ολοκληρωθεί χωρίς να πετάξει σφάλμα, το recovery αγνοείται. Αν το try πετάξει σφάλμα, το σφάλμα ωθείται στη στοίβα και το recovery εκτελείται:

[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"

[ "ok" ] [ drop "never runs" ] recover .
! => "ok"

Το when από το kernel είναι ο φυσικός σύντροφός του: εκτελεί ένα quotation μόνο όταν η κορυφή της στοίβας είναι αληθής:

: check-positive ( n -- )
    0 < [ "negative!" throw ] when ;

ERROR:

Το ERROR: ορίζει μια κλάση tuple και μια λέξη που κατασκευάζει ένα καινούριο στιγμιότυπο και το πετάει:

! DOCTEST: SKIP
ERROR: not-found path ;

"/missing" not-found
! throws T{ not-found { path "/missing" } }

Ένα σφάλμα χωρίς slots είναι απλώς ERROR: name ;, και η κλήση του name πετάει ένα κενό στιγμιότυπο. Τα tuples που ορίζονται με το ERROR: φέρουν ένα predicate κλάσης, το name?, που μπορείς να το χρησιμοποιήσεις για να ελέγξεις αν ένα σφάλμα που έπιασες ήταν αυτού του τύπου.

Διαβάζοντας ξανά τα slots

Ένα σφάλμα που έπιασες είναι απλώς ένα tuple, οπότε κάθε slot του ERROR: συνοδεύεται από τον ίδιο αυτόματα παραγόμενο reader slot>> όπως κάθε άλλο tuple.

! DOCTEST: SKIP
{
    T{ not-found { path "/a" } }
    T{ not-found { path "/b" } }
}
[ path>> ] map .   ! => { "/a" "/b" }

Οδηγίες

Η Έλενα, η νέα υπεύθυνη ποιότητας σε ένα εργοστάσιο εφημερίδων, σου ζητά να γράψεις ένα μικρό πρόγραμμα που θα παρακολουθεί τον χώρο παραγωγής.

1. Όρισε ένα προσαρμοσμένο σφάλμα

Όρισε μια κλάση tuple σφάλματος machine-error χρησιμοποιώντας τη λέξη ανάλυσης ERROR:. Δεν χρειάζεται πεδία.

machine-error   ! throws a fresh machine-error

2. Έλεγξε την υγρασία

Όρισε τη check-humidity. Παίρνει μια μέτρηση υγρασίας από τη στοίβα και κάνει throw τη συμβολοσειρά "humidity too high" όταν η μέτρηση είναι αυστηρά μεγαλύτερη από 70. Διαφορετικά, δεν επιστρέφει τίποτα.

50 check-humidity   ! returns nothing
80 check-humidity   ! throws "humidity too high"

3. Έλεγξε τη θερμοκρασία

Όρισε τη check-temperature. Παίρνει μια μέτρηση θερμοκρασίας και κάνει throw τη συμβολοσειρά "temperature too high" όταν η μέτρηση είναι αυστηρά μεγαλύτερη από 500. Διαφορετικά, δεν επιστρέφει τίποτα.

400 check-temperature   ! returns nothing
600 check-temperature   ! throws "temperature too high"

4. Παρακολούθησε το μηχάνημα

Όρισε τη monitor ώστε να παίρνει μια υγρασία και μια θερμοκρασία από τη στοίβα και να εκτελεί και τους δύο ελέγχους. Αν κάποιος από τους ελέγχους πετάξει, το monitor πρέπει να πετάξει ένα νέο machine-error αντ' αυτού. Αν και οι δύο περάσουν, το monitor δεν επιστρέφει τίποτα.

50 400 monitor   ! returns nothing
80 400 monitor   ! throws a machine-error
50 600 monitor   ! throws a machine-error

5. Παρακολούθησε μια παρτίδα μετρήσεων

Όρισε τη monitor-batch ώστε να παίρνει έναν πίνακα από μετρήσεις { humidity temperature } και να επιστρέφει πόσες από αυτές θα αποτύχουν (δηλαδή, πόσες θα έκαναν το monitor να πετάξει).

{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Factor Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ασφάλεια εργοστασίου;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.