patch 7.4.2090
Problem:    Using submatch() in a lambda passed to substitute() is verbose.
Solution:   Use a static list and pass it as an optional argument to the
            function.  Fix memory leak.
diff --git a/src/list.c b/src/list.c
index 13f9200..9e0e26f 100644
--- a/src/list.c
+++ b/src/list.c
@@ -924,4 +924,35 @@
     return ret;
 }
 
+/*
+ * Initialize a static list with 10 items.
+ */
+    void
+init_static_list(staticList10_T *sl)
+{
+    list_T  *l = &sl->sl_list;
+    int	    i;
+
+    memset(sl, 0, sizeof(staticList10_T));
+    l->lv_first = &sl->sl_items[0];
+    l->lv_last = &sl->sl_items[9];
+    l->lv_refcount = DO_NOT_FREE_CNT;
+    l->lv_lock = VAR_FIXED;
+    sl->sl_list.lv_len = 10;
+
+    for (i = 0; i < 10; ++i)
+    {
+	listitem_T *li = &sl->sl_items[i];
+
+	if (i == 0)
+	    li->li_prev = NULL;
+	else
+	    li->li_prev = li - 1;
+	if (i == 9)
+	    li->li_next = NULL;
+	else
+	    li->li_next = li + 1;
+    }
+}
+
 #endif /* defined(FEAT_EVAL) */