2012-10-14 30 views
0

我問了一個類似於前面的問題,並且解決了原始問題。我遇到了另一個被其他錯誤隱藏的問題。我能夠使「if」語句正常工作,但不是「while」語句。當評估「stmt」時,必須更新環境。這正常工作對我的 「如果」 聲明是這樣的:用Haskell編寫的一個迷你語言,「while」語句出現問題

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語句已經有類似的結構,那麼這很簡單,但是我沒有意識到這一點。

+0

你缺少'if ... then .. else ..'的'else'分支。 – huon

回答

4

你缺少你的功能的else條款,這也許應該是:

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

要真正使其工作,即執行體多次:

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