diff --git a/src/macro/MacroValue.cc b/src/macro/MacroValue.cc
index c44f80c13fd4137aaff526de28b1ed7fc575d3bd..4d1f0ca05f146ea96f3483bffc9c36cf36ee1ca3 100644
--- a/src/macro/MacroValue.cc
+++ b/src/macro/MacroValue.cc
@@ -329,6 +329,12 @@ StringMV::print()
   return "'" + value + "'";
 }
 
+shared_ptr<IntMV>
+StringMV::length() noexcept(false)
+{
+  return make_shared<IntMV>(value.length());
+}
+
 FuncMV::FuncMV(vector<string> args_arg, string body_arg) :
   args{move(args_arg)}, body{move(body_arg)}
 {
diff --git a/src/macro/MacroValue.hh b/src/macro/MacroValue.hh
index b8e782d0da884f4f120734b18a7cfbfd9cfaeec1..35c9c934d956bc75fb18db07f0ee01bb237b90cb 100644
--- a/src/macro/MacroValue.hh
+++ b/src/macro/MacroValue.hh
@@ -161,6 +161,7 @@ public:
   //! Returns underlying string value
   string toString() override;
   string print() override;
+  shared_ptr<IntMV> length() noexcept(false) override;
 };
 
 class FuncMV : public MacroValue