public void RemoveCallable(string identifier, CallableSymbol callable)
        {
            if (!_table.Contains(identifier) || !(_table[identifier] is List <CallableSymbol> callables))
            {
                return;
            }
            foreach (var callableSymbol in callables)
            {
                if (callable.ParametersTypes.Count != callableSymbol.ParametersTypes.Count)
                {
                    continue;
                }
                bool found = true;
                for (int i = 0; i < callable.ParametersTypes.Count; ++i)
                {
                    if (!callable.ParametersTypes[i].Equals(callableSymbol.ParametersTypes[i]))
                    {
                        found = false;
                    }
                }

                if (found)
                {
                    callables.Remove(callableSymbol);
                    break;
                }
            }
        }
        public bool AddCallable(string identifier, CallableSymbol callable)
        {
            var paramTypes = new List <SymType>(from type in callable.ParametersTypes select type.Item2);

            foreach (var parametersType in callable.ParametersTypes)
            {
                paramTypes.Add(parametersType.Item2);
            }

            if (FindCallable(identifier, paramTypes) != null)
            {
                return(false);
            }

            if (_table.Contains(identifier))
            {
                if (_table[identifier] is List <CallableSymbol> callableSymbols && !callableSymbols.Contains(callable))
                {
                    callableSymbols.Add(callable);
                }
            }
            else
            {
                _table.Add(identifier.ToLower(), new List <CallableSymbol> {
                    callable
                });
            }

            return(true);
        }