public static void loadNow(ZContenedor e)
        {
            List <NodoDeclararParametro> parametros = new List <NodoDeclararParametro>();


            FuncionNativa f = new FuncionNativa(TiposPrimitivos.tipoDate, parametros, e,
                                                list =>
            {
                return(new ZTiempo(DateTime.Now.ToString()));
            }

                                                );

            e.declararFuncion("now", f);
        }
        public static void cargarFuncionesNativas(ZContenedor e)
        {
            var countZFun = new FuncionNativa(
                TiposPrimitivos.tipoNumero,
                crearListaParametros(TiposPrimitivos.tipoResultadoQuery),
                e,
                args =>
            {
                var resultadoQuery = (ZResultadoQuery)args[0];
                return(new ZNumero(resultadoQuery.Resultado.Count));
            }
                );



            var sumZFun = new FuncionNativa(
                TiposPrimitivos.tipoDicimal,
                crearListaParametros(TiposPrimitivos.tipoResultadoQuery),
                e,
                args =>
            {
                var resultado = ((ZResultadoQuery)args[0]).Resultado;
                if (resultado.Count == 0)
                {
                    return(new ZDecimal(0));
                }

                tieneUnaSolaColumna(resultado);

                double total = 0;

                foreach (var fila in resultado)
                {
                    switch (fila[0])
                    {
                    case ZNumero zNumero:
                        total += zNumero.obtenerValor();
                        continue;

                    case ZDecimal zDecimal:
                        total += zDecimal.obtenerValor();
                        continue;

                    default:
                        throw new SemanticError($"Todos los valores deben de ser numericos en 'sum'. Encontrado '{fila[0].Origen.Nombre}'");
                    }
                }

                return(new ZDecimal(total));
            }
                );


            var avgZFun = new FuncionNativa(
                TiposPrimitivos.tipoDicimal,
                crearListaParametros(TiposPrimitivos.tipoResultadoQuery),
                e,
                args =>
            {
                var resultado = ((ZResultadoQuery)args[0]).Resultado;
                if (resultado.Count == 0)
                {
                    return(new ZDecimal(0));
                }

                tieneUnaSolaColumna(resultado);

                double total = 0;

                foreach (var fila in resultado)
                {
                    switch (fila[0])
                    {
                    case ZNumero zNumero:
                        total += zNumero.obtenerValor();
                        continue;

                    case ZDecimal zDecimal:
                        total += zDecimal.obtenerValor();
                        continue;

                    default:
                        throw new SemanticError($"Todos los valores deben de ser numericos en 'sum'. Encontrado '{fila[0].Origen.Nombre}'");
                    }
                }
                return(new ZDecimal(total / resultado.Count));
            }
                );



            var maxZFun = new FuncionNativa(
                TiposPrimitivos.tipoDicimal,
                crearListaParametros(TiposPrimitivos.tipoResultadoQuery),
                e,
                args =>
            {
                var resultado = ((ZResultadoQuery)args[0]).Resultado;
                if (resultado.Count == 0)
                {
                    return(new ZDecimal(0));
                }

                tieneUnaSolaColumna(resultado);

                DateTime?maxTiempo = null;
                DateTime?maxDate   = null;
                double?maximo      = null;

                foreach (var fila in resultado)
                {
                    switch (fila[0])
                    {
                    case ZNumero zNumero:
                        if (maximo == null)
                        {
                            maximo = zNumero.obtenerValor();
                        }
                        else
                        {
                            if (zNumero.obtenerValor() > maximo)
                            {
                                maximo = zNumero.obtenerValor();
                            }
                        }
                        continue;

                    case ZDecimal zDecimal:
                        if (maximo == null)
                        {
                            maximo = zDecimal.obtenerValor();
                        }
                        else
                        {
                            if (zDecimal.obtenerValor() > maximo)
                            {
                                maximo = zDecimal.obtenerValor();
                            }
                        }
                        continue;

                    case ZDate zDate:
                        if (maxDate == null)
                        {
                            maxDate = zDate.obtenerValor();
                        }
                        else
                        {
                            if (zDate.obtenerValor() > maxDate)
                            {
                                maxDate = zDate.obtenerValor();
                            }
                        }
                        continue;

                    case ZTiempo zTiempo:

                        if (maxTiempo == null)
                        {
                            maxTiempo = zTiempo.obtenerValor();
                        }
                        else
                        {
                            if (zTiempo.obtenerValor() > maxTiempo)
                            {
                                maxTiempo = zTiempo.obtenerValor();
                            }
                        }

                        continue;

                    default:
                        throw new SemanticError($"Tipo no valido para 'max'. Encontrado '{fila[0].Origen.Nombre}'");
                    }
                }

                if (maximo != null)
                {
                    return(new ZDecimal(maximo.Value));
                }
                if (maxDate != null)
                {
                    return(new ZDate(maxDate.Value));
                }
                if (maxTiempo != null)
                {
                    return(new ZTiempo(maxTiempo.Value));
                }

                return(TiposPrimitivos.instanicaNulo);
            }
                );

            var minZFun = new FuncionNativa(
                TiposPrimitivos.tipoDicimal,
                crearListaParametros(TiposPrimitivos.tipoResultadoQuery),
                e,
                args =>
            {
                var resultado = ((ZResultadoQuery)args[0]).Resultado;
                if (resultado.Count == 0)
                {
                    return(new ZDecimal(0));
                }

                tieneUnaSolaColumna(resultado);

                DateTime?maxTiempo = null;
                DateTime?maxDate   = null;
                double?maximo      = null;

                foreach (var fila in resultado)
                {
                    switch (fila[0])
                    {
                    case ZNumero zNumero:
                        if (maximo == null)
                        {
                            maximo = zNumero.obtenerValor();
                        }
                        else
                        {
                            if (zNumero.obtenerValor() < maximo)
                            {
                                maximo = zNumero.obtenerValor();
                            }
                        }
                        continue;

                    case ZDecimal zDecimal:
                        if (maximo == null)
                        {
                            maximo = zDecimal.obtenerValor();
                        }
                        else
                        {
                            if (zDecimal.obtenerValor() < maximo)
                            {
                                maximo = zDecimal.obtenerValor();
                            }
                        }
                        continue;

                    case ZDate zDate:
                        if (maxDate == null)
                        {
                            maxDate = zDate.obtenerValor();
                        }
                        else
                        {
                            if (zDate.obtenerValor() < maxDate)
                            {
                                maxDate = zDate.obtenerValor();
                            }
                        }
                        continue;

                    case ZTiempo zTiempo:

                        if (maxTiempo == null)
                        {
                            maxTiempo = zTiempo.obtenerValor();
                        }
                        else
                        {
                            if (zTiempo.obtenerValor() < maxTiempo)
                            {
                                maxTiempo = zTiempo.obtenerValor();
                            }
                        }

                        continue;

                    default:
                        throw new SemanticError($"Tipo no valido para 'min'. Encontrado '{fila[0].Origen.Nombre}'");
                    }
                }

                if (maximo != null)
                {
                    return(new ZDecimal(maximo.Value));
                }
                if (maxDate != null)
                {
                    return(new ZDate(maxDate.Value));
                }
                if (maxTiempo != null)
                {
                    return(new ZTiempo(maxTiempo.Value));
                }

                return(TiposPrimitivos.instanicaNulo);
            }
                );


            e.declararFuncion("count", countZFun);
            e.declararFuncion("sum", sumZFun);
            e.declararFuncion("avg", avgZFun);
            e.declararFuncion("max", maxZFun);
            e.declararFuncion("min", minZFun);
        }