diff --git a/src/macro/Expressions.cc b/src/macro/Expressions.cc
index 9d34f81723850e6679359520f1bf8ed6738cd0bc..2c9eb762a6123c65979a8a9c465768d76b959a49 100644
--- a/src/macro/Expressions.cc
+++ b/src/macro/Expressions.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019-2022 Dynare Team
+ * Copyright © 2019-2023 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -607,7 +607,7 @@ Tuple::cast_real(Environment &env) const
 }
 
 BaseTypePtr
-Range::eval(Environment &env)
+Range::eval(Environment &env) const
 {
   RealPtr incdbl = make_shared<Real>(1);
   if (inc)
@@ -630,7 +630,7 @@ Range::eval(Environment &env)
 }
 
 BaseTypePtr
-Array::eval(Environment &env)
+Array::eval(Environment &env) const
 {
   vector<ExpressionPtr> retval;
   for (const auto &it : arr)
@@ -639,7 +639,7 @@ Array::eval(Environment &env)
 }
 
 BaseTypePtr
-Tuple::eval(Environment &env)
+Tuple::eval(Environment &env) const
 {
   vector<ExpressionPtr> retval;
   for (const auto &it : tup)
@@ -648,7 +648,7 @@ Tuple::eval(Environment &env)
 }
 
 BaseTypePtr
-Variable::eval(Environment &env)
+Variable::eval(Environment &env) const
 {
   if (indices && !indices->empty())
     {
@@ -731,7 +731,7 @@ Variable::eval(Environment &env)
 }
 
 BaseTypePtr
-Function::eval(Environment &env)
+Function::eval(Environment &env) const
 {
   FunctionPtr func;
   ExpressionPtr body;
@@ -770,7 +770,7 @@ Function::eval(Environment &env)
 }
 
 BaseTypePtr
-UnaryOp::eval(Environment &env)
+UnaryOp::eval(Environment &env) const
 {
   try
     {
@@ -870,7 +870,7 @@ UnaryOp::eval(Environment &env)
 }
 
 BaseTypePtr
-BinaryOp::eval(Environment &env)
+BinaryOp::eval(Environment &env) const
 {
   try
     {
@@ -930,7 +930,7 @@ BinaryOp::eval(Environment &env)
 }
 
 BaseTypePtr
-TrinaryOp::eval(Environment &env)
+TrinaryOp::eval(Environment &env) const
 {
   try
     {
@@ -956,7 +956,7 @@ TrinaryOp::eval(Environment &env)
 }
 
 BaseTypePtr
-Comprehension::eval(Environment &env)
+Comprehension::eval(Environment &env) const
 {
   ArrayPtr input_set;
   VariablePtr vp;
diff --git a/src/macro/Expressions.hh b/src/macro/Expressions.hh
index b66f5038761ffa265c62d3a400f89e96f8622aa0..cbd0cf75a5f6df9e0bee4aa97d163fa1947e26e5 100644
--- a/src/macro/Expressions.hh
+++ b/src/macro/Expressions.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019-2022 Dynare Team
+ * Copyright © 2019-2023 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -120,7 +120,7 @@ namespace macro
       Node(move(location_arg)) { }
     virtual string to_string() const noexcept = 0;
     virtual void print(ostream &output, bool matlab_output = false) const noexcept = 0;
-    virtual BaseTypePtr eval(Environment &env) = 0;
+    virtual BaseTypePtr eval(Environment &env) const = 0;
     virtual ExpressionPtr clone() const noexcept = 0;
   };
 
@@ -131,7 +131,7 @@ namespace macro
     explicit BaseType(Tokenizer::location location_arg = Tokenizer::location()) :
       Expression(move(location_arg)) { }
     virtual codes::BaseType getType() const noexcept = 0;
-    BaseTypePtr eval([[maybe_unused]] Environment &env) override { return shared_from_this(); }
+    BaseTypePtr eval([[maybe_unused]] Environment &env) const override { return const_pointer_cast<BaseType>(shared_from_this()); }
   public:
     virtual BaseTypePtr plus([[maybe_unused]] const BaseTypePtr &bt) const { throw StackTrace("Operator + does not exist for this type"); }
     virtual BaseTypePtr unary_plus() const { throw StackTrace("Unary operator + does not exist for this type"); }
@@ -400,7 +400,7 @@ namespace macro
     codes::BaseType getType() const noexcept override { return codes::BaseType::Tuple; }
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr clone() const noexcept override;
   public:
     size_t size() const { return tup.size(); }
@@ -431,7 +431,7 @@ namespace macro
     codes::BaseType getType() const noexcept override { return codes::BaseType::Array; }
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr clone() const noexcept override;
   public:
     size_t size() const { return arr.size(); }
@@ -480,7 +480,7 @@ namespace macro
       return retval + end->to_string() + "]";
     }
     void print(ostream &output, [[maybe_unused]] bool matlab_output = false) const noexcept override { output << to_string(); }
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr
     clone() const noexcept override
     {
@@ -511,7 +511,7 @@ namespace macro
       Expression(move(location_arg)), name{move(name_arg)}, indices{move(indices_arg)} { }
     string to_string() const noexcept override { return name; }
     void print(ostream &output, [[maybe_unused]] bool matlab_output = false) const noexcept override { output << name; }
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr
     clone() const noexcept override
     {
@@ -540,7 +540,7 @@ namespace macro
     {
       printName(output); printArgs(output);
     }
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr clone() const noexcept override;
   public:
     void printName(ostream &output) const noexcept { output << name; }
@@ -562,7 +562,7 @@ namespace macro
       Expression(move(location_arg)), op_code{move(op_code_arg)}, arg{move(arg_arg)} { }
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr
     clone() const noexcept override
     {
@@ -585,7 +585,7 @@ namespace macro
   public:
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr
     clone() const noexcept override
     {
@@ -607,7 +607,7 @@ namespace macro
       arg1{move(arg1_arg)}, arg2{move(arg2_arg)}, arg3{move(arg3_arg)} { }
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr
     clone() const noexcept override
     {
@@ -649,7 +649,7 @@ namespace macro
       c_vars{move(c_vars_arg)}, c_set{move(c_set_arg)}, c_when{move(c_when_arg)} { }
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
-    BaseTypePtr eval(Environment &env) override;
+    BaseTypePtr eval(Environment &env) const override;
     ExpressionPtr clone() const noexcept override;
   };
 }