protected override string VisitFunctionCall(CallExpression exp, out object resultObj)
        {
            Depth++;
            var function     = exp.Name;
            var paramBuilder = new StringBuilder();
            var iParam       = 0;
            var donutFn      = _functionDict.GetFunction(function);

            donutFn.Parameters = exp.Parameters;
            string result;
            var    aggStage = _aggTree.AddFunction(donutFn);

            if (donutFn is IDonutTemplateFunction <string> fnTemplate)
            {
                FeatureFunctions.Enqueue(donutFn);
                var codeContext = new DonutCodeContext(_script);
                result          = fnTemplate.GetTemplate(exp, codeContext);
                donutFn.Content = new DonutFeatureDefinition(result);
                resultObj       = donutFn;
            }
            else if (donutFn.IsAggregate)
            {
                string aggregateResult = donutFn.GetValue();
                if (aggregateResult == null)
                {
                    resultObj = null;
                    return("");
                }
                donutFn.Content = new DonutFeatureDefinition(aggregateResult = aggStage.GetValue());//FillCallParameters(donutFn, exp.Parameters);
                resultObj       = donutFn;
                Aggregates.Enqueue(donutFn);
                result = aggregateResult;
            }
            else
            {
                FeatureFunctions.Enqueue(donutFn);
                foreach (var parameter in exp.Parameters)
                {
                    var paramStr = Visit(parameter as IExpression);
                    paramBuilder.Append(paramStr);
                    if (iParam < exp.Parameters.Count - 1)
                    {
                        paramBuilder.Append(", ");
                    }
                    iParam++;
                }
                result    = $"{donutFn}({paramBuilder})";
                resultObj = donutFn;
            }
            Depth--;
            return(result);
        }
        protected override string VisitFunctionCall(CallExpression exp, out object resultObj)
        {
            Depth++;
            resultObj = null;
            var function     = exp.Name;
            var paramBuilder = new StringBuilder();
            var iParam       = 0;
            var donutFn      = _functionDict.GetFunction(function);

            donutFn.Parameters = exp.Parameters;
            //string result;
            //var aggStage = _aggTree.AddFunction(donutFn);

            if (donutFn is IDonutTemplateFunction <DonutCodeFeatureDefinition> fnTemplate)
            {
                FeatureFunctions.Enqueue(donutFn);
                var codeContext            = new DonutCodeContext(_script);
                var donutFeatureDefinition = fnTemplate.GetTemplate(exp, codeContext);
                if (donutFeatureDefinition == DonutCodeFeatureDefinition.Empty)
                {
                    return(null);
                }
                //result = donutFeatureDefinition.ToString();
                donutFn.Content = donutFeatureDefinition;
                resultObj       = donutFn;
            }
            else
            {
                FeatureFunctions.Enqueue(donutFn);
                foreach (var parameter in exp.Parameters)
                {
                    var paramStr = Visit(parameter as IExpression);
                    paramBuilder.Append(paramStr);
                    if (iParam < exp.Parameters.Count - 1)
                    {
                        paramBuilder.Append(", ");
                    }
                    iParam++;
                }
                //result = $"{donutFn}({paramBuilder})";
                resultObj = donutFn;
            }
            Depth--;
            return("");
        }