diff --git a/src/macro/Expressions.cc b/src/macro/Expressions.cc
index 2c9eb762a6123c65979a8a9c465768d76b959a49..c34e850052e170bade9f27f9725488a022288685 100644
--- a/src/macro/Expressions.cc
+++ b/src/macro/Expressions.cc
@@ -1010,7 +1010,7 @@ Comprehension::eval(Environment &env) const
         if (!c_expr)
           throw StackTrace("Comprehension", "Internal Error: Impossible case", location);
         else
-          values.emplace_back(c_expr->clone()->eval(env));
+          values.emplace_back(c_expr->eval(env));
       else
         {
           RealPtr dp;
@@ -1030,7 +1030,7 @@ Comprehension::eval(Environment &env) const
             }
           if ((bp && *bp) || (dp && *dp))
             if (c_expr)
-              values.emplace_back(c_expr->clone()->eval(env));
+              values.emplace_back(c_expr->eval(env));
             else
               values.emplace_back(btp);
         }
@@ -1038,44 +1038,6 @@ Comprehension::eval(Environment &env) const
   return make_shared<Array>(values);
 }
 
-ExpressionPtr
-Tuple::clone() const noexcept
-{
-  vector<ExpressionPtr> tup_copy;
-  for (const auto &it : tup)
-    tup_copy.emplace_back(it->clone());
-  return make_shared<Tuple>(tup_copy, location);
-}
-
-ExpressionPtr
-Array::clone() const noexcept
-{
-  vector<ExpressionPtr> arr_copy;
-  for (const auto &it : arr)
-    arr_copy.emplace_back(it->clone());
-  return make_shared<Array>(arr_copy, location);
-}
-
-ExpressionPtr
-Function::clone() const noexcept
-{
-  vector<ExpressionPtr> args_copy;
-  for (const auto &it : args)
-    args_copy.emplace_back(it->clone());
-  return make_shared<Function>(name, args_copy, location);
-}
-
-ExpressionPtr
-Comprehension::clone() const noexcept
-{
-  if (c_expr && c_when)
-    return make_shared<Comprehension>(c_expr->clone(), c_vars->clone(), c_set->clone(), c_when->clone(), location);
-  else if (c_expr)
-    return make_shared<Comprehension>(c_expr->clone(), c_vars->clone(), c_set->clone(), location);
-  else
-    return make_shared<Comprehension>(true, c_vars->clone(), c_set->clone(), c_when->clone(), location);
-}
-
 string
 Array::to_string() const noexcept
 {
diff --git a/src/macro/Expressions.hh b/src/macro/Expressions.hh
index cbd0cf75a5f6df9e0bee4aa97d163fa1947e26e5..52f0903070bdd917fdb1710c21f7196fa24a9c38 100644
--- a/src/macro/Expressions.hh
+++ b/src/macro/Expressions.hh
@@ -121,7 +121,6 @@ namespace macro
     virtual string to_string() const noexcept = 0;
     virtual void print(ostream &output, bool matlab_output = false) const noexcept = 0;
     virtual BaseTypePtr eval(Environment &env) const = 0;
-    virtual ExpressionPtr clone() const noexcept = 0;
   };
 
 
@@ -213,7 +212,6 @@ namespace macro
     codes::BaseType getType() const noexcept override { return codes::BaseType::Bool; }
     string to_string() const noexcept override { return value ? "true" : "false"; }
     void print(ostream &output, [[maybe_unused]] bool matlab_output = false) const noexcept override { output << to_string(); }
-    ExpressionPtr clone() const noexcept override { return make_shared<Bool>(value, location); }
   public:
     operator bool() const { return value; }
     BoolPtr is_equal(const BaseTypePtr &btp) const override;
@@ -261,7 +259,6 @@ namespace macro
       return strs.str();
     }
     void print(ostream &output, [[maybe_unused]] bool matlab_output = false) const noexcept override { output << to_string(); }
-    ExpressionPtr clone() const noexcept override { return make_shared<Real>(value, location); }
   public:
     operator double() const { return value; }
     BaseTypePtr plus(const BaseTypePtr &bt) const override;
@@ -355,7 +352,6 @@ namespace macro
     codes::BaseType getType() const noexcept override { return codes::BaseType::String; }
     string to_string() const noexcept override { return value; }
     void print(ostream &output, bool matlab_output = false) const noexcept override;
-    ExpressionPtr clone() const noexcept override { return make_shared<String>(value, location); }
   public:
     operator string() const { return value; }
     BaseTypePtr plus(const BaseTypePtr &bt) const override;
@@ -401,7 +397,6 @@ namespace macro
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr clone() const noexcept override;
   public:
     size_t size() const { return tup.size(); }
     bool empty() const { return tup.empty(); }
@@ -432,7 +427,6 @@ namespace macro
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr clone() const noexcept override;
   public:
     size_t size() const { return arr.size(); }
     const vector<ExpressionPtr> &getValue() const { return arr; }
@@ -481,13 +475,6 @@ namespace macro
     }
     void print(ostream &output, [[maybe_unused]] bool matlab_output = false) const noexcept override { output << to_string(); }
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr
-    clone() const noexcept override
-    {
-      return inc ?
-        make_shared<Range>(start, inc, end, location)
-        : make_shared<Range>(start, end, location);
-    }
   public:
     BoolPtr
     is_equal([[maybe_unused]] const BaseTypePtr &btp) const override
@@ -512,12 +499,6 @@ namespace macro
     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) const override;
-    ExpressionPtr
-    clone() const noexcept override
-    {
-      return indices ? make_shared<Variable>(name, indices, location) :
-        make_shared<Variable>(name, location);
-    }
   public:
     const string &getName() const noexcept { return name; }
     codes::BaseType getType(const Environment &env) const { return env.getType(name); }
@@ -541,7 +522,6 @@ namespace macro
       printName(output); printArgs(output);
     }
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr clone() const noexcept override;
   public:
     void printName(ostream &output) const noexcept { output << name; }
     void printArgs(ostream &output) const noexcept;
@@ -563,11 +543,6 @@ namespace macro
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr
-    clone() const noexcept override
-    {
-      return make_shared<UnaryOp>(op_code, arg->clone(), location);
-    }
   };
 
 
@@ -586,11 +561,6 @@ namespace macro
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr
-    clone() const noexcept override
-    {
-      return make_shared<BinaryOp>(op_code, arg1->clone(), arg2->clone(), location);
-    }
   };
 
 
@@ -608,11 +578,6 @@ namespace macro
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr
-    clone() const noexcept override
-    {
-      return make_shared<TrinaryOp>(op_code, arg1->clone(), arg2->clone(), arg3->clone(), location);
-    }
   };
 
 
@@ -650,7 +615,6 @@ namespace macro
     string to_string() const noexcept override;
     void print(ostream &output, bool matlab_output = false) const noexcept override;
     BaseTypePtr eval(Environment &env) const override;
-    ExpressionPtr clone() const noexcept override;
   };
 }
 #endif