diff --git a/exprtk.hpp b/exprtk.hpp
index b2542ee..905694b 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -2436,7 +2436,7 @@
                   /*
                      Permit symbols that contain a 'dot'
                      Allowed   : abc.xyz, a123.xyz, abc.123, abc_.xyz a123_.xyz abc._123
-                     Disallowed: abc.<white-space>, abc.<eof>
+                     Disallowed: abc.<white-space>, abc.<eof>, abc.<operator +,-,*,/...>
                   */
                   if (
                        !is_end(s_itr_ + 1)                      &&
@@ -4377,18 +4377,18 @@
       namespace loop_unroll
       {
          #ifndef exprtk_disable_superscalar_unroll
-         const std::size_t global_loop_batch_size = 16;
+         const unsigned int global_loop_batch_size = 16;
          #else
-         const std::size_t global_loop_batch_size = 4;
+         const unsigned int global_loop_batch_size = 4;
          #endif
 
          struct details
          {
             details(const std::size_t& vsize,
-                    const std::size_t loop_batch_size = global_loop_batch_size)
+                    const unsigned int loop_batch_size = global_loop_batch_size)
             : batch_size(loop_batch_size),
               remainder (vsize % batch_size),
-              upper_bound(static_cast<int>(vsize - (remainder ? loop_batch_size : 0)))
+              upper_bound(static_cast<int>(vsize) - (remainder ? loop_batch_size : 0))
             {}
 
             int  batch_size;
@@ -36286,6 +36286,11 @@
 
       nthelement()
       : exprtk::igeneric_function<T>("VT|VTTT")
+        /*
+           Overloads:
+           0. VT   - vector, nth-element
+           1. VTTT - vector, nth-element, r0, r1
+        */
       {}
 
       inline T operator()(const std::size_t& ps_index, parameter_list_t parameters)
@@ -36311,6 +36316,61 @@
    };
 
    template <typename T>
+   class iota : public exprtk::igeneric_function<T>
+   {
+   public:
+
+      typedef typename exprtk::igeneric_function<T> igfun_t;
+      typedef typename igfun_t::parameter_list_t    parameter_list_t;
+      typedef typename igfun_t::generic_type        generic_type;
+      typedef typename generic_type::scalar_view    scalar_t;
+      typedef typename generic_type::vector_view    vector_t;
+
+      using exprtk::igeneric_function<T>::operator();
+
+      iota()
+      : exprtk::igeneric_function<T>("VT|VTT|VTTT|VTTTT")
+        /*
+           Overloads:
+           0. VT   - vector, increment
+           1. VT   - vector, increment, base
+           2. VT   - vector, increment, r0, r1
+           3. VT   - vector, increment, base, r0, r1
+        */
+      {}
+
+      inline T operator()(const std::size_t& ps_index, parameter_list_t parameters)
+      {
+         vector_t vec(parameters[0]);
+
+         T increment = scalar_t(parameters[1])();
+         T base      = ((1 == ps_index) || (3 == ps_index))? scalar_t(parameters[2])() : T(0);
+
+         std::size_t r0 = 0;
+         std::size_t r1 = vec.size() - 1;
+
+         if ((2 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
+            return std::numeric_limits<T>::quiet_NaN();
+         else if ((3 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,3,4))
+            return std::numeric_limits<T>::quiet_NaN();
+
+         if (details::invalid_range(vec,r0,r1))
+            return std::numeric_limits<T>::quiet_NaN();
+         else
+         {
+            long long j = 0;
+
+            for (std::size_t i = r0; i <= r1; ++i, ++j)
+            {
+               vec[i] = base + (increment * j);
+            }
+         }
+
+         return T(1);
+      }
+   };
+
+   template <typename T>
    class sumk : public exprtk::igeneric_function<T>
    {
    public:
@@ -36721,6 +36781,7 @@
       shift_right<T> sr;
       sort       <T> st;
       nthelement <T> ne;
+      iota       <T> ia;
       sumk       <T> sk;
       axpy       <T> b1_axpy;
       axpby      <T> b1_axpby;
@@ -36760,6 +36821,8 @@
             return false;
          else if (!symtab.add_function("nth_element"  ,ne))
             return false;
+         else if (!symtab.add_function("iota"         ,ia))
+            return false;
          else if (!symtab.add_function("sumk"         ,sk))
             return false;
          else if (!symtab.add_function("axpy"    ,b1_axpy))
diff --git a/exprtk_test.cpp b/exprtk_test.cpp
index 5a9f423..def1d39 100644
--- a/exprtk_test.cpp
+++ b/exprtk_test.cpp
@@ -6556,6 +6556,12 @@
                      "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); sort(v,0,trunc(v[] / 2)); (v[v[] / 2] == 5) and (v[0] == 1)",
                      "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); sort(v,0,trunc(v[] / 3)); (v[v[] / 3] == 4) and (v[0] == 1)",
 
+                     "var v[5]; iota(v,2);      var r[5] := {0,2,4,6,8}; sum(v == r) == v[]",
+                     "var v[5]; iota(v,2,1);    var r[5] := {1,3,5,7,9}; sum(v == r) == v[]",
+                     "var v[5]; iota(v,1,1,3);  var r[5] := {0,0,1,2,0}; sum(v == r) == v[]",
+                     "var v[5]; iota(v,2,2,1,3);var r[5] := {0,2,4,6,0}; sum(v == r) == v[]",
+                     "var v[5]; iota(v,2,1,1,3);var r[5] := {0,1,3,5,0}; sum(v == r) == v[]",
+
                      " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + y; axpy(a,x,y); sum(y == r) == y[]",
                      " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + b * y; axpby(a,x,b,y); sum(y == r) == y[]",
 
diff --git a/readme.txt b/readme.txt
index ed39952..f527a2b 100644
--- a/readme.txt
+++ b/readme.txt
@@ -2735,10 +2735,11 @@
    (g) rotate-left (h) rotate-right
    (i) shift-left  (j) shift-right
    (k) sort        (l) nth_element
-   (m) sumk        (n) axpy
-   (o) axpby       (p) axpyz
-   (q) axpbyz      (r) axpbz
-   (s) dot         (t) dotk
+   (m) iota        (n) sumk
+   (o) axpy        (p) axpby
+   (q) axpyz       (r) axpbyz
+   (s) axpbz       (t) dot
+   (u) dotk
 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
