public override SymbolBase VisitList([NotNull] ListContext context) { if (context.forms().ChildCount == 0) { return(new ListSymbol(context.GetText())); } List <SymbolBase> symbols = new(); for (int i = 0; i < context.forms().ChildCount; i++) { symbols.Add(Visit(context.forms().form(i))); } if (symbols[0] is not SymbolSymbol) { return(new AnySymbol(context.GetText())); } _ = (symbols[0] as SymbolSymbol) ?? throw new TypeCastException( $"{Regex.Replace(symbols[0].GetType().Name, "Symbol$", "")} cannot be cast to " + $"{Regex.Replace(typeof(FunctionSymbol).Name, "Symbol$", "")}."); if (symbolTable.Root.SymbolMap.ContainsKey(symbols[0].Name)) { return((SymbolBase)Activator.CreateInstance( ((FunctionSymbol)symbolTable.Root.SymbolMap[symbols[0].Name]) .Accept(symbols.Skip(1).Select(s => s.GetType()).ToList()), context.GetText())); } else { throw new SyntaxException( $"Unable to resolve symbol: {symbols[0].Name} in this context."); } }