7.9 示例:表达式求值器

在本节中,我们将创建简单算术表达式的一个求值器。我们将使用一个接口Expr来代表这种语言中的任意一个表达式。现在,这个接口没有任何方法,但稍后我们会逐个添加。

我们的表达式语言包括浮点数字面量,二元操作符+、-、*、/,一元操作符–x和+x,函数调用pow(x,y)、sin(x)和sqrt(x),变量(比如x和pi),当然,还有圆括号和标准的操作符优先级。所有的值都是float64类型。下面是几个示例表达式:

下面5种具体类型代表特定类型的表达式。Var代表变量应用(很快我们将了解到为什么这个类型需要导出)。literal代表浮点数常量。unary和binary类型代表有一个或者两个操作数的操作符表达式,而操作数则可以任意的Expr。call代表函数调用,这里限制它的fn字段只能是pow、sin和sqrt。

要对包含变量的表达式进行求值,需要一个上下文(environment)来把变量映射到数值:

我们还需要为每种类型的表达式定义一个Eval方法来返回表达式在一个给定上下文下的值。既然每个表达式都必须提供这个方法,那么可以把它加到Expr接口中。这个包只导出了类型Expr、Env和Var。客户端可以在不接触其他表达式类型的情况下使用这个求值器。 ...

Get Go程序设计语言 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.