Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Delégua] Função que retorna função #623

Open
leonelsanchesdasilva opened this issue Feb 4, 2024 · 5 comments
Open

[Delégua] Função que retorna função #623

leonelsanchesdasilva opened this issue Feb 4, 2024 · 5 comments
Assignees
Labels
💎 recompensa-10 Pagamos recompensa: 10 dólares problema Problemas na execução do Delégua

Comments

@leonelsanchesdasilva
Copy link
Contributor

leonelsanchesdasilva commented Feb 4, 2024

O seguinte exemplo é válido sintaticamente, mas sua execução apresenta problemas:

funcao facaCurrying(some) {
 retorna funcao(a) {
    retorna funcao(b) {
      retorna some(a, b)
    };
 };
}

funcao some(a, b) {
 retorna a + b
}

var someViaCurryng = facaCurrying(some)

escreva(someViaCurryng(1)(2))

Tradução esperada para JavaScript:

function facaCurrying(some) {
 return function(a) {
    return function(b) {
      return some(a, b)
    };
 };
}

function some(a, b) {
 return a + b
}

var someViaCurryng = facaCurrying(some)

console.log(someViaCurryng(1)(2)) // 3

Erros atuais:

image

image

@leonelsanchesdasilva leonelsanchesdasilva added problema Problemas na execução do Delégua 💎 recompensa-10 Pagamos recompensa: 10 dólares labels Feb 4, 2024
@ItaloCobains ItaloCobains self-assigned this Jun 30, 2024
@ItaloCobains
Copy link
Contributor

Notei que as funções anonimas no corpo estão separadas do Retorna. Elas deveriam estar no valor do Retorna correto?

{
  declaracoes: [
    {
      linha: 1,
      hashArquivo: -1,
      assinaturaMetodo: "<principal>",
      simbolo: {
        tipo: "IDENTIFICADOR",
        lexema: "facaCurrying",
        literal: null,
        linha: 1,
        hashArquivo: -1,
      },
      funcao: {
        linha: 1,
        hashArquivo: -1,
        parametros: [
          {
            abrangencia: "padrao",
            nome: {
              tipo: "IDENTIFICADOR",
              lexema: "some",
              literal: null,
              linha: 1,
              hashArquivo: -1,
            },
          },
        ],
        tipoRetorno: null,
        corpo: [
          {
            linha: 2,
            hashArquivo: -1,
            assinaturaMetodo: "<principal>",
            simboloChave: {
              tipo: "RETORNA",
              lexema: "retorna",
              literal: null,
              linha: 2,
              hashArquivo: -1,
            },
            valor: null,
          },
          {
            linha: 2,
            hashArquivo: -1,
            assinaturaMetodo: "<principal>",
            expressao: {
              linha: 2,
              hashArquivo: -1,
              parametros: [
                {
                  abrangencia: "padrao",
                  nome: {
                    tipo: "IDENTIFICADOR",
                    lexema: "a",
                    literal: null,
                    linha: 2,
                    hashArquivo: -1,
                  },
                },
              ],
              tipoRetorno: null,
              corpo: [
                {
                  linha: 3,
                  hashArquivo: -1,
                  assinaturaMetodo: "<principal>",
                  simboloChave: {
                    tipo: "RETORNA",
                    lexema: "retorna",
                    literal: null,
                    linha: 3,
                    hashArquivo: -1,
                  },
                  valor: null,
                },
                {
                  linha: 3,
                  hashArquivo: -1,
                  assinaturaMetodo: "<principal>",
                  expressao: {
                    linha: 3,
                    hashArquivo: -1,
                    parametros: [
                      {
                        abrangencia: "padrao",
                        nome: {
                          tipo: "IDENTIFICADOR",
                          lexema: "b",
                          literal: null,
                          linha: 3,
                          hashArquivo: -1,
                        },
                      },
                    ],
                    tipoRetorno: null,
                    corpo: [
                      {
                        linha: 4,
                        hashArquivo: -1,
                        assinaturaMetodo: "<principal>",
                        simboloChave: {
                          tipo: "RETORNA",
                          lexema: "retorna",
                          literal: null,
                          linha: 4,
                          hashArquivo: -1,
                        },
                        valor: {
                          id: "f12f85f9-c051-4654-96df-d6334f134f26",
                          linha: 4,
                          hashArquivo: -1,
                          entidadeChamada: {
                            linha: 4,
                            hashArquivo: -1,
                            simbolo: {
                              tipo: "IDENTIFICADOR",
                              lexema: "some",
                              literal: null,
                              linha: 4,
                              hashArquivo: -1,
                            },
                          },
                          parentese: {
                            tipo: "PARENTESE_DIREITO",
                            lexema: "",
                            literal: null,
                            linha: 4,
                            hashArquivo: -1,
                          },
                          argumentos: [
                            {
                              linha: 4,
                              hashArquivo: -1,
                              simbolo: {
                                tipo: "IDENTIFICADOR",
                                lexema: "a",
                                literal: null,
                                linha: 4,
                                hashArquivo: -1,
                              },
                            },
                            {
                              linha: 4,
                              hashArquivo: -1,
                              simbolo: {
                                tipo: "IDENTIFICADOR",
                                lexema: "b",
                                literal: null,
                                linha: 4,
                                hashArquivo: -1,
                              },
                            },
                          ],
                        },
                      },
                    ],
                  },
                },
              ],
            },
          },
        ],
      },
      tipoRetorno: null,
      decoradores: [
      ],
    },
    {
      linha: 8,
      hashArquivo: -1,
      assinaturaMetodo: "<principal>",
      simbolo: {
        tipo: "IDENTIFICADOR",
        lexema: "some",
        literal: null,
        linha: 8,
        hashArquivo: -1,
      },
      funcao: {
        linha: 8,
        hashArquivo: -1,
        parametros: [
          {
            abrangencia: "padrao",
            nome: {
              tipo: "IDENTIFICADOR",
              lexema: "a",
              literal: null,
              linha: 8,
              hashArquivo: -1,
            },
          },
          {
            abrangencia: "padrao",
            nome: {
              tipo: "IDENTIFICADOR",
              lexema: "b",
              literal: null,
              linha: 8,
              hashArquivo: -1,
            },
          },
        ],
        tipoRetorno: null,
        corpo: [
          {
            linha: 9,
            hashArquivo: -1,
            assinaturaMetodo: "<principal>",
            simboloChave: {
              tipo: "RETORNA",
              lexema: "retorna",
              literal: null,
              linha: 9,
              hashArquivo: -1,
            },
            valor: {
              linha: 9,
              hashArquivo: -1,
              esquerda: {
                linha: 9,
                hashArquivo: -1,
                simbolo: {
                  tipo: "IDENTIFICADOR",
                  lexema: "a",
                  literal: null,
                  linha: 9,
                  hashArquivo: -1,
                },
              },
              operador: {
                tipo: "ADICAO",
                lexema: "+",
                literal: null,
                linha: 9,
                hashArquivo: -1,
              },
              direita: {
                linha: 9,
                hashArquivo: -1,
                simbolo: {
                  tipo: "IDENTIFICADOR",
                  lexema: "b",
                  literal: null,
                  linha: 9,
                  hashArquivo: -1,
                },
              },
            },
          },
        ],
      },
      tipoRetorno: null,
      decoradores: [
      ],
    },
    {
      linha: 11,
      hashArquivo: -1,
      assinaturaMetodo: "<principal>",
      simbolo: {
        tipo: "IDENTIFICADOR",
        lexema: "someViaCurryng",
        literal: null,
        linha: 11,
        hashArquivo: -1,
      },
      inicializador: {
        id: "a2d8147a-5529-4251-9618-c3a4f9ae494e",
        linha: 11,
        hashArquivo: -1,
        entidadeChamada: {
          linha: 11,
          hashArquivo: -1,
          simbolo: {
            tipo: "IDENTIFICADOR",
            lexema: "facaCurrying",
            literal: null,
            linha: 11,
            hashArquivo: -1,
          },
        },
        parentese: {
          tipo: "PARENTESE_DIREITO",
          lexema: "",
          literal: null,
          linha: 11,
          hashArquivo: -1,
        },
        argumentos: [
          {
            linha: 11,
            hashArquivo: -1,
            simbolo: {
              tipo: "IDENTIFICADOR",
              lexema: "some",
              literal: null,
              linha: 11,
              hashArquivo: -1,
            },
          },
        ],
      },
      tipo: null,
      referencia: false,
      desestruturacao: false,
    },
    {
      linha: 12,
      hashArquivo: -1,
      assinaturaMetodo: "<principal>",
      argumentos: [
        {
          id: "071210dc-4b74-42c2-a432-46c6abf5a6bf",
          linha: 12,
          hashArquivo: -1,
          entidadeChamada: {
            id: "b9c70d41-a7d6-4d3a-961f-53d891f04d03",
            linha: 12,
            hashArquivo: -1,
            entidadeChamada: {
              linha: 12,
              hashArquivo: -1,
              simbolo: {
                tipo: "IDENTIFICADOR",
                lexema: "someViaCurryng",
                literal: null,
                linha: 12,
                hashArquivo: -1,
              },
            },
            parentese: {
              tipo: "PARENTESE_DIREITO",
              lexema: "",
              literal: null,
              linha: 12,
              hashArquivo: -1,
            },
            argumentos: [
              {
                linha: 12,
                hashArquivo: -1,
                valor: 1,
              },
            ],
          },
          parentese: {
            tipo: "PARENTESE_DIREITO",
            lexema: "",
            literal: null,
            linha: 12,
            hashArquivo: -1,
          },
          argumentos: [
            {
              linha: 12,
              hashArquivo: -1,
              valor: 2,
            },
          ],
        },
      ],
    },
  ],
  erros: [
  ],
}

@leonelsanchesdasilva
Copy link
Contributor Author

Notei que as funções anonimas no corpo estão separadas do Retorna. Elas deveriam estar no valor do Retorna correto?

{

  declaracoes: [

    {

      linha: 1,

      hashArquivo: -1,

      assinaturaMetodo: "<principal>",

      simbolo: {

        tipo: "IDENTIFICADOR",

        lexema: "facaCurrying",

        literal: null,

        linha: 1,

        hashArquivo: -1,

      },

      funcao: {

        linha: 1,

        hashArquivo: -1,

        parametros: [

          {

            abrangencia: "padrao",

            nome: {

              tipo: "IDENTIFICADOR",

              lexema: "some",

              literal: null,

              linha: 1,

              hashArquivo: -1,

            },

          },

        ],

        tipoRetorno: null,

        corpo: [

          {

            linha: 2,

            hashArquivo: -1,

            assinaturaMetodo: "<principal>",

            simboloChave: {

              tipo: "RETORNA",

              lexema: "retorna",

              literal: null,

              linha: 2,

              hashArquivo: -1,

            },

            valor: null,

          },

          {

            linha: 2,

            hashArquivo: -1,

            assinaturaMetodo: "<principal>",

            expressao: {

              linha: 2,

              hashArquivo: -1,

              parametros: [

                {

                  abrangencia: "padrao",

                  nome: {

                    tipo: "IDENTIFICADOR",

                    lexema: "a",

                    literal: null,

                    linha: 2,

                    hashArquivo: -1,

                  },

                },

              ],

              tipoRetorno: null,

              corpo: [

                {

                  linha: 3,

                  hashArquivo: -1,

                  assinaturaMetodo: "<principal>",

                  simboloChave: {

                    tipo: "RETORNA",

                    lexema: "retorna",

                    literal: null,

                    linha: 3,

                    hashArquivo: -1,

                  },

                  valor: null,

                },

                {

                  linha: 3,

                  hashArquivo: -1,

                  assinaturaMetodo: "<principal>",

                  expressao: {

                    linha: 3,

                    hashArquivo: -1,

                    parametros: [

                      {

                        abrangencia: "padrao",

                        nome: {

                          tipo: "IDENTIFICADOR",

                          lexema: "b",

                          literal: null,

                          linha: 3,

                          hashArquivo: -1,

                        },

                      },

                    ],

                    tipoRetorno: null,

                    corpo: [

                      {

                        linha: 4,

                        hashArquivo: -1,

                        assinaturaMetodo: "<principal>",

                        simboloChave: {

                          tipo: "RETORNA",

                          lexema: "retorna",

                          literal: null,

                          linha: 4,

                          hashArquivo: -1,

                        },

                        valor: {

                          id: "f12f85f9-c051-4654-96df-d6334f134f26",

                          linha: 4,

                          hashArquivo: -1,

                          entidadeChamada: {

                            linha: 4,

                            hashArquivo: -1,

                            simbolo: {

                              tipo: "IDENTIFICADOR",

                              lexema: "some",

                              literal: null,

                              linha: 4,

                              hashArquivo: -1,

                            },

                          },

                          parentese: {

                            tipo: "PARENTESE_DIREITO",

                            lexema: "",

                            literal: null,

                            linha: 4,

                            hashArquivo: -1,

                          },

                          argumentos: [

                            {

                              linha: 4,

                              hashArquivo: -1,

                              simbolo: {

                                tipo: "IDENTIFICADOR",

                                lexema: "a",

                                literal: null,

                                linha: 4,

                                hashArquivo: -1,

                              },

                            },

                            {

                              linha: 4,

                              hashArquivo: -1,

                              simbolo: {

                                tipo: "IDENTIFICADOR",

                                lexema: "b",

                                literal: null,

                                linha: 4,

                                hashArquivo: -1,

                              },

                            },

                          ],

                        },

                      },

                    ],

                  },

                },

              ],

            },

          },

        ],

      },

      tipoRetorno: null,

      decoradores: [

      ],

    },

    {

      linha: 8,

      hashArquivo: -1,

      assinaturaMetodo: "<principal>",

      simbolo: {

        tipo: "IDENTIFICADOR",

        lexema: "some",

        literal: null,

        linha: 8,

        hashArquivo: -1,

      },

      funcao: {

        linha: 8,

        hashArquivo: -1,

        parametros: [

          {

            abrangencia: "padrao",

            nome: {

              tipo: "IDENTIFICADOR",

              lexema: "a",

              literal: null,

              linha: 8,

              hashArquivo: -1,

            },

          },

          {

            abrangencia: "padrao",

            nome: {

              tipo: "IDENTIFICADOR",

              lexema: "b",

              literal: null,

              linha: 8,

              hashArquivo: -1,

            },

          },

        ],

        tipoRetorno: null,

        corpo: [

          {

            linha: 9,

            hashArquivo: -1,

            assinaturaMetodo: "<principal>",

            simboloChave: {

              tipo: "RETORNA",

              lexema: "retorna",

              literal: null,

              linha: 9,

              hashArquivo: -1,

            },

            valor: {

              linha: 9,

              hashArquivo: -1,

              esquerda: {

                linha: 9,

                hashArquivo: -1,

                simbolo: {

                  tipo: "IDENTIFICADOR",

                  lexema: "a",

                  literal: null,

                  linha: 9,

                  hashArquivo: -1,

                },

              },

              operador: {

                tipo: "ADICAO",

                lexema: "+",

                literal: null,

                linha: 9,

                hashArquivo: -1,

              },

              direita: {

                linha: 9,

                hashArquivo: -1,

                simbolo: {

                  tipo: "IDENTIFICADOR",

                  lexema: "b",

                  literal: null,

                  linha: 9,

                  hashArquivo: -1,

                },

              },

            },

          },

        ],

      },

      tipoRetorno: null,

      decoradores: [

      ],

    },

    {

      linha: 11,

      hashArquivo: -1,

      assinaturaMetodo: "<principal>",

      simbolo: {

        tipo: "IDENTIFICADOR",

        lexema: "someViaCurryng",

        literal: null,

        linha: 11,

        hashArquivo: -1,

      },

      inicializador: {

        id: "a2d8147a-5529-4251-9618-c3a4f9ae494e",

        linha: 11,

        hashArquivo: -1,

        entidadeChamada: {

          linha: 11,

          hashArquivo: -1,

          simbolo: {

            tipo: "IDENTIFICADOR",

            lexema: "facaCurrying",

            literal: null,

            linha: 11,

            hashArquivo: -1,

          },

        },

        parentese: {

          tipo: "PARENTESE_DIREITO",

          lexema: "",

          literal: null,

          linha: 11,

          hashArquivo: -1,

        },

        argumentos: [

          {

            linha: 11,

            hashArquivo: -1,

            simbolo: {

              tipo: "IDENTIFICADOR",

              lexema: "some",

              literal: null,

              linha: 11,

              hashArquivo: -1,

            },

          },

        ],

      },

      tipo: null,

      referencia: false,

      desestruturacao: false,

    },

    {

      linha: 12,

      hashArquivo: -1,

      assinaturaMetodo: "<principal>",

      argumentos: [

        {

          id: "071210dc-4b74-42c2-a432-46c6abf5a6bf",

          linha: 12,

          hashArquivo: -1,

          entidadeChamada: {

            id: "b9c70d41-a7d6-4d3a-961f-53d891f04d03",

            linha: 12,

            hashArquivo: -1,

            entidadeChamada: {

              linha: 12,

              hashArquivo: -1,

              simbolo: {

                tipo: "IDENTIFICADOR",

                lexema: "someViaCurryng",

                literal: null,

                linha: 12,

                hashArquivo: -1,

              },

            },

            parentese: {

              tipo: "PARENTESE_DIREITO",

              lexema: "",

              literal: null,

              linha: 12,

              hashArquivo: -1,

            },

            argumentos: [

              {

                linha: 12,

                hashArquivo: -1,

                valor: 1,

              },

            ],

          },

          parentese: {

            tipo: "PARENTESE_DIREITO",

            lexema: "",

            literal: null,

            linha: 12,

            hashArquivo: -1,

          },

          argumentos: [

            {

              linha: 12,

              hashArquivo: -1,

              valor: 2,

            },

          ],

        },

      ],

    },

  ],

  erros: [

  ],

}

Sim, como valor de Retornar.

@ItaloCobains
Copy link
Contributor

@leonelsanchesdasilva nessa função não deveria ter uma lógica para resolver literal? Atualmente ele resolve bem argumentos de tipo Variável, mas quando passamos literais e esse tipo de tratativas que temos.
image

@leonelsanchesdasilva
Copy link
Contributor Author

@leonelsanchesdasilva nessa função não deveria ter uma lógica para resolver literal? Atualmente ele resolve bem argumentos de tipo Variável, mas quando passamos literais e esse tipo de tratativas que temos. image

@ItaloCobains Aparentemente o literal já é resolvido na hora de definir o argumento. Qual seria o motivo para não resolver aí?

@ItaloCobains
Copy link
Contributor

ItaloCobains commented Jul 8, 2024

Achei estranho o nome ser um undefined, entretanto aparentemente o problema não é aí. Continuarei investigando.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💎 recompensa-10 Pagamos recompensa: 10 dólares problema Problemas na execução do Delégua
Projects
None yet
Development

When branches are created from issues, their pull requests are automatically linked.

2 participants