Υλοποίησε έναν αξιολογητή για ένα πολύ απλό υποσύνολο της Forth.
Forth είναι μια γλώσσα προγραμματισμού βασισμένη σε στοίβα. Υλοποίησε έναν πολύ βασικό αξιολογητή για ένα μικρό υποσύνολο της Forth.
Ο αξιολογητής σου πρέπει να υποστηρίζει τις παρακάτω λέξεις:
+, -, *, / (ακέραια αριθμητική)DUP, DROP, SWAP, OVER (χειρισμός στοίβας)Ο αξιολογητής σου πρέπει επίσης να υποστηρίζει τον ορισμό νέων λέξεων χρησιμοποιώντας τη συνηθισμένη σύνταξη: : word-name definition ;.
Για να κρατήσουμε τα πράγματα απλά, ο μόνος τύπος δεδομένων που χρειάζεται να υποστηρίξεις είναι οι προσημασμένοι ακέραιοι μεγέθους τουλάχιστον 16 bit.
Πρέπει να χρησιμοποιήσεις τους παρακάτω κανόνες για τη σύνταξη: ένας αριθμός είναι μια ακολουθία από ένα ή περισσότερα ψηφία (ASCII), και μια λέξη είναι μια ακολουθία από ένα ή περισσότερα γράμματα, ψηφία, σύμβολα ή σημεία στίξης που δεν είναι αριθμός. (Η Forth χρησιμοποιεί πιθανώς ελαφρώς διαφορετικούς κανόνες, αλλά αυτό είναι αρκετά κοντά.)
Οι λέξεις δεν κάνουν διάκριση πεζών-κεφαλαίων.
Μερικές φορές χρειάζεται και να προσαρμόσεις και να πετάξεις με raise εξαιρέσεις στον κώδικά σου. Όταν το κάνεις αυτό, πρέπει πάντα να συμπεριλαμβάνεις ένα μήνυμα σφάλματος με νόημα που να δείχνει ποια είναι η πηγή του σφάλματος. Αυτό κάνει τον κώδικά σου πιο ευανάγνωστο και βοηθάει σημαντικά στο debugging.
Οι προσαρμοσμένες εξαιρέσεις μπορούν να δημιουργηθούν μέσα από νέες κλάσεις εξαιρέσεων (δες τις classes για περισσότερες λεπτομέρειες.) οι οποίες είναι συνήθως υποκλάσεις της Exception.
Σε περιπτώσεις όπου ξέρεις ότι η πηγή του σφάλματος θα είναι παράγωγο ενός συγκεκριμένου τύπου εξαίρεσης, μπορείς να επιλέξεις να κληρονομήσεις από έναν από τους built in error types κάτω από την κλάση Exception. Όταν πετάς το σφάλμα, θα πρέπει και πάλι να συμπεριλαμβάνεις ένα μήνυμα με νόημα.
Αυτή η συγκεκριμένη άσκηση απαιτεί να δημιουργήσεις μια προσαρμοσμένη εξαίρεση που θα πετιέται/"πετιέται" όταν η στοίβα δεν είναι αρκετά γεμάτη. Τα tests θα περάσουν μόνο αν προσαρμόσεις μια κατάλληλη εξαίρεση, την πετάξεις με raise και συμπεριλάβεις κατάλληλα μηνύματα σφάλματος.
# subclassing the Exception to create a StackUnderflowError
class StackUnderflowError(Exception):
"""Exception raised when Stack is not full.
message: explanation of the error.
"""
def __init__(self, message):
self.message = message
# raising a StackUnderflowError
raise StackUnderflowError("Insufficient number of items in stack")
Επιπλέον, αυτή η άσκηση απαιτεί να πετάξεις αρκετές built-in exceptions με μηνύματα σφάλματος.
Για να πετάξεις μια built-in exception με μήνυμα, γράψε το μήνυμα ως όρισμα στον τύπο της exception:
# an example when division by zero is attempted.
raise ZeroDivisionError("divide by zero")
#an example when the operation is undefined.
raise ValueError("undefined operation")
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.