+
+/*-------------------------.
+| Append NODE to the LIST. |
+`-------------------------*/
+
+symbol_list *
+symbol_list_append (symbol_list *list, symbol_list *node)
+{
+ if (!list)
+ return node;
+ symbol_list *next = list;
+ while (next->next)
+ next = next->next;
+ next->next = node;
+ return list;
+}
+
+
+/*-----------------------------------------------.
+| Free the LIST, but not the items it contains. |
+`-----------------------------------------------*/
+
+void
+symbol_list_free (symbol_list *list)
+{
+ symbol_list *node, *next;
+ for (node = list; node; node = next)
+ {
+ next = node->next;
+ named_ref_free (node->named_ref);
+ if (node->content_type == SYMLIST_TYPE)
+ free (node->content.sem_type);
+ free (node);
+ }
+}
+
+
+/*--------------------.
+| Return its length. |
+`--------------------*/
+
+int
+symbol_list_length (symbol_list const *l)
+{
+ int res = 0;
+ for (/* Nothing. */;
+ l && !(l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL);
+ l = l->next)
+ ++res;
+ return res;
+}
+
+
+/*------------------------------.
+| Get item N in symbol list L. |
+`------------------------------*/
+
+symbol_list *
+symbol_list_n_get (symbol_list *l, int n)