Implementa un valutatore per un sottoinsieme molto semplice di Forth.
Forth è un linguaggio di programmazione basato sullo stack. Implementa un valutatore di base per un piccolo sottoinsieme di Forth.
Il valutatore deve supportare le seguenti parole:
+, -, *, / (aritmetica con numeri interi)DUP, DROP, SWAP, OVER (manipolazione dello stack)Il valutatore deve anche supportare la definizione di nuove parole usando la sintassi abituale: : word-name definition ;.
Per mantenere le cose semplici, l'unico tipo di dato che devi supportare sono i numeri interi con segno di almeno 16 bit.
Per la sintassi, usa le seguenti regole: un numero è una sequenza di una o più cifre (ASCII), una parola è una sequenza di una o più lettere, cifre, simboli o segni di punteggiatura che non sia un numero. (Probabilmente Forth usa regole leggermente diverse, ma queste sono abbastanza vicine.)
Le parole non distinguono maiuscole e minuscole.
A volte è necessario sia personalizzare sia raise le eccezioni nel codice. Quando lo fai, dovresti sempre includere un messaggio di errore significativo per indicare qual è l'origine dell'errore. Questo rende il codice più leggibile e aiuta notevolmente durante il debug.
Le eccezioni personalizzate si possono creare tramite nuove classi di eccezione (vedi classes per maggiori dettagli.) che di solito sono sottoclassi di Exception.
Per le situazioni in cui sai che l'origine dell'errore sarà una derivata di un certo tipo di eccezione, puoi scegliere di ereditare da uno dei built in error types sotto la classe Exception. Quando sollevi l'errore, dovresti comunque includere un messaggio significativo.
Questo particolare esercizio richiede che tu crei un'eccezione personalizzata da sollevare/«lanciare» quando lo stack non è riempito a sufficienza. I test passeranno solo se personalizzi un'eccezione appropriata, fai raise di quella eccezione e includi messaggi di errore appropriati.
# 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")
Inoltre, questo esercizio richiede che tu sollevi diverse built-in exceptions con messaggi di errore.
Per sollevare una built-in exception con un messaggio, scrivi il messaggio come argomento al tipo 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")
Iscriviti a Exercism per imparare e padroneggiare Python con 17 concetti146 esercizi e il mentoring di persone reali, tutto gratis.