【问题标题】:Wrapping up a mini-language written in Haskell, problems with "while" statement总结用 Haskell 编写的迷你语言,“while”语句的问题
【发布时间】:2012-10-14 15:10:31
【问题描述】:

我之前问了一个类似的问题,并解决了最初的问题。我遇到了另一个错误隐藏的附加问题。我能够使诸如“if”语句之类的语句正常工作,但不能使“while”语句正常工作。当评估“stmt”时,必须更新环境。这适用于我的“if”语句,如下所示:

exec :: Env -> Stmt -> Env
exec env (If c t e) = 
    exec env ( if eval env c == BoolLit True then t else e )

eval 看起来像这样:

eval :: Env -> Expr -> Expr
eval _ (IntLit i) = IntLit i
eval _ (BoolLit b) = BoolLit b
eval env (Var n) = lookupVar env n
eval env (BinOp op a b) = primEval op (eval env a) (eval env b)

被解析的文件如下所示:

x = 1; c = 0;
if (x < 2) c = c + 1; else ;

我尝试让 while 语句工作是这样完成的:

exec env (While c t) = exec env ( if eval env c == BoolLit True then t)

但这会在 ')' 上产生解析错误。被解析文件中while语句的预期格式:

x = 1; c = 1;
while (x < 10)
{
  c = c * x;
  x = x + 1;
}
c

我正在尝试了解如何根据这种预期格式返回正确的环境。如果 Haskell 中的 while 语句已经有类似的结构,那就很简单了,但据我所知,没有这样的结构。

【问题讨论】:

  • 您缺少if .. then .. else ..else 分支。

标签: haskell mini-language


【解决方案1】:

您的函数中缺少else 子句,它应该是:

exec env (While c t) = if eval env c == BoolLit True then exec env t else env

真正让它工作,就是多次执行body:

exec env (While c t) = if   eval env c == BoolLit True 
                       then exec (exec env t) (While c t)
                       else env

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多