Forth

Forth

中等

说明

实现一个非常简单的 Forth 子集的求值器。

Forth 是一种基于栈的编程语言。 为 Forth 的一个小子集实现一个最基础的求值器。

你的求值器需要支持以下单词:

  • +、-、*、/(整数运算)
  • DUP、DROP、SWAP、OVER(栈操作)

你的求值器还需要支持用惯用语法定义新的单词:: word-name definition ;。

为简单起见,你唯一需要支持的数据类型是至少 16 位的有符号整数。

语法应遵循以下规则:数字是一个或多个(ASCII)数字组成的序列,单词则是一个或多个字母、数字、符号或标点组成的序列,并且不能是数字。 (Forth 实际使用的规则可能略有不同,不过这样已经足够接近了。)

单词不区分大小写。

自定义与抛出异常

有时,你需要在代码里既自定义异常,又raise异常。这样做时,你应该始终包含一条有意义的错误消息,说明错误的来源是什么。这能让你的代码更易读,对调试也有很大帮助。

自定义异常可以通过新的异常类来创建(详情请见classes),这些类通常是Exception的子类。

如果你知道错误的来源属于某种异常类型的派生类型,可以选择继承 Exception 类下的某个built in error types。抛出错误时,你仍然应该包含一条有意义的消息。

这道练习要求你创建一个_自定义异常_,在栈填充不充分时抛出/“throw”它。只有当你自定义了合适的异常、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")
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Python Exercism

准备好开始 Forth 了吗?

注册 Exercism,借助 17 个概念146 个练习 和真人导师指导,学习并掌握 Python,全部免费。