以前、これと同様の質問をして、元の質問を解決してもらいました。他のエラーによって隠されていた追加の問題が発生しました。「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ステートメントに同様の構造がすでに存在する場合は簡単ですが、私が知っているこのような構造は存在しません。