Forth

Forth

困难

说明

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

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

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

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

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

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

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

单词不区分大小写。

实现

在 Forth 中,函数被称为words,它们对数据栈进行操作。 每个词从栈中获取形参,并把返回值放回栈上。

Forth 文档总是用以下形式给出词执行前和执行后的数据栈状态:( p1 p2 ... pN --- r1 r2 ... rN )。 其中,p1到pN这些值表示调用前栈上该词的形参(栈中更靠上的位置可能还有未在此表示的其他数据),r1到rN这些值表示调用后栈上该词的返回值。 分隔符---区分词执行前后的栈状态。

需要实现的词定义如下:

  • ToS 表示栈顶
  • 栈顶表示为最右边的值
词 栈状态 描述
+ ( a b --- sum ) sum = a + b
- ( a b --- diff ) diff = a - b
* ( a b --- prod ) prod = a * b
/ ( a b --- quot ) quot = a / b
dup ( a --- a a ) 复制栈顶的值
drop ( a --- ) 丢弃栈顶的值
swap ( a b --- b a ) 交换栈顶的两个值
over ( a b c --- a b c b ) 复制第 2 个值到栈顶

如果你想试用在线 Forth 解释器,或进一步了解需要实现的词,请试试 Easy Forth (特别是“Adding Some Numbers”、“Defining Words”和“Stack Manipulation”部分)。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Odin Exercism

准备好开始 Forth 了吗?

注册 Exercism,借助 73 个练习 和真人导师指导,学习并掌握 Odin,全部免费。