-- |Evaluate an expression in a certain environment.
eval :: Env -> Expr -> ThrowError Expr
eval env (AppExpr f s) = --apply env f s
    do s' <- eval env s
       apply env f s'
--eval env le@(ListExpr es) = return le --liftM ListExpr $ mapM (eval env) es
eval :: Env -> Expr -> ThrowError Expr
eval env (AppExpr f s) = --apply env f s
    do s' <- eval env s
       apply env f s'
--eval env le@(ListExpr es) = return le --liftM ListExpr $ mapM (eval env) es
eval env (AppExpr f s) = --apply env f s
    do s' <- eval env s
       apply env f s'
--eval env le@(ListExpr es) = return le --liftM ListExpr $ mapM (eval env) es