Forthのごく単純なサブセットを評価する評価機を実装します。
Forthはスタックベースのプログラミング言語です。 Forthの小さなサブセットを評価する、ごく基本的な評価機を実装しましょう。
評価機は次のワードに対応する必要があります。
+、-、*、/(整数演算)DUP、DROP、SWAP、OVER(スタック操作)また、慣習的な構文 : word-name definition ; を使って新しいワードを定義する機能にも対応する必要があります。
話を簡単にするため、対応が必要なデータ型は16ビット以上の符号付き整数だけです。
構文には次のルールを使います。数値は1つ以上の(ASCII)数字の並びで、ワードは数値ではない1つ以上の英字、数字、記号、句読点の並びです。 (Forthはおそらくもう少し違うルールを使っていますが、これで十分近いはずです。)
ワードは大文字と小文字を区別しません。
コードの中で例外をカスタマイズしたり、raiseしたりする必要があることがあります。その際は、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めるようにしましょう。これにより、コードが読みやすくなり、デバッグもぐっとはかどります。
カスタム例外は、新しい例外クラスを作ることで定義できます(詳しくはclassesを参照してください)。こうしたクラスは、通常はExceptionのサブクラスです。
エラーの原因が特定の例外型から派生したものであると分かっている場合は、_Exception_クラスの下にあるbuilt in error typesのいずれかを継承することを選べます。エラーを送出するときも、意味のあるメッセージを含めるようにしましょう。
この演習では、スタックの中身が足りないときに送出("スロー")される_カスタム例外_を作成する必要があります。テストに合格するには、適切な例外をカスタマイズし、その例外を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")