/// <summary>
 /// Saves an AST term and returns a symbol uniquely identifying it.
 /// Does no add term to set of root terms for rewriting.
 /// </summary>
 public Term StoreTerm(ITrlTerm parseResult)
 {
     if (parseResult is Identifier id)
     {
         return(StoreAtom(id.Name, SymbolType.Identifier));
     }
     else if (parseResult is StringValue str)
     {
         return(StoreAtom(str.Value, SymbolType.String));
     }
     else if (parseResult is NumericValue num)
     {
         return(StoreAtom(num.Value, SymbolType.Number));
     }
     else if (parseResult is TermList termList)
     {
         var arguments = termList.Terms.Select(t => StoreTerm(t)).ToArray();
         return(StoreTermList(arguments));
     }
     else if (parseResult is NonAcTerm nonAcTerm)
     {
         var arguments = nonAcTerm.Arguments.Select(t => StoreTerm(t)).ToArray();
         return(StoreNonAcTerm(nonAcTerm.TermName.Name, arguments, StoreMetadata(nonAcTerm)));
     }
     else if (parseResult is Variable var)
     {
         return(StoreVariable(var.Name));
     }
     else
     {
         throw new NotImplementedException();
     }
 }
        private void CheckClassMappingMembers(ITrlTerm term, List <string> errorList)
        {
            var nonAcTerm = term as NonAcTerm;

            if (nonAcTerm == null)
            {
                return;
            }

            // Check arguments
            foreach (ITrlTerm arg in nonAcTerm.Arguments)
            {
                CheckClassMappingMembers(arg, errorList);
            }

            if (nonAcTerm.ClassMemberMappings == null)
            {
                return;
            }

            // Check that class member mappings count is the same as argument count
            var classMemberCount = nonAcTerm.ClassMemberMappings.ClassMembers.Count;

            if (classMemberCount != nonAcTerm.Arguments.Count)
            {
                errorList.Add(string.Format(Errors.NumberOfClassMembers, nonAcTerm.ToSourceCode()));
            }

            // Check that class member name mappings do not contain namespacing
            if (classMemberCount > 0)
            {
                foreach (var member in nonAcTerm.ClassMemberMappings.ClassMembers)
                {
                    if (member.Name.Contains("."))
                    {
                        errorList.Add(string.Format(Errors.NamespacedClassMembers, member.ToSourceCode()));
                    }
                }
            }
        }