我最近一直在为基本的编程语言编写解释器,一切正常。但是,有人可以建议我添加对双打的支持的最佳方法。目前只支持整数,但我也想添加对双精度数的支持。
问问题
311 次
2 回答
4
输入环境 a = [[Var, a]]
这是一个类型家族。Env Int
是 int 环境,Env Double
是 double 环境,依此类推。这不是一个可以同时保存整数和双精度的类型,这可能是您需要的。
可以同时保存整数和双精度的类型可能如下所示:
data Val = IntNum Int | DoubleNum Double
然后您可以将环境设置为
type Env = [ (Var, Val) ]
(我不知道您为什么在这里使用列表列表)。
您需要为IntNum
和DoubleNum
情况分别定义算术运算(如果您的语言支持,也可能为混合操作数定义)。
添加布尔值和列表很简单,只需在Val
.
您将不得不处理您的语言中出现的类型错误,因为它开始支持多种类型。我不认为这种简单的设计非常适合静态类型安全的语言。如果你想要这样,设计必须进行重大调整。
于 2012-06-15T18:51:25.017 回答
2
简单的答案是定义一个可以保存 etherInt
或Double
s 的变体类型,例如
data Value = Int Int
| Double Double
并相应修改Env
和其他类型的定义:
type Env = [[(Var, Value)]]
data ValExpr = IVar Var
| IVal Value
...
但是如果您打算添加更多类型,我会考虑使用GADT。
编辑:错字
于 2012-06-15T18:38:43.023 回答