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

Bloque definición #20

Open
1 task
PalumboN opened this issue May 8, 2020 · 6 comments
Open
1 task

Bloque definición #20

PalumboN opened this issue May 8, 2020 · 6 comments
Assignees

Comments

@PalumboN
Copy link
Collaborator

PalumboN commented May 8, 2020

Después de hacer #19, la posta de las postas es un bloque definición para poder definir funciones. Pensaba en que sería útil tener 3 bloques distintos:

  • Uno para la definición propiamente dicha, que te deja ponerle un nombre
  • Otros para los parámetros, que te deja poner un nombre al parámetro (y en el futuro se pueden implementar los pattern matching)
  • Un bloque de equivalencia que solamente separa el cuerpo

Por ejemplo
image

Los bloques definición y parámetro deben poder crear sus calls:

  • En el caso de la función crea un bloque función con los agujeros según como está definida
  • Los parámetros generan un bloque valor, con el nombre del parámetro. Validar que no se pueda usar fuera de contexto.

Todo esto ya está resuelto de una manera cheta en https://github.com/Program-AR/proceds-blockly

  • Pensar en la notación / inferencia de tipos 🤔
@PalumboN
Copy link
Collaborator Author

PalumboN commented May 8, 2020

Dejo el código que usé para la demo:

Blockly.Blocks['definition'] = {
  init: function() {
    this.appendValueInput("NAME")
        .setCheck(null)
        .appendField(new Blockly.FieldTextInput("funcion"), "NAME");
    this.setColour(230);
 this.setTooltip("");
 this.setHelpUrl("");
  }
};
Blockly.Blocks['parameter'] = {
  init: function() {
    this.appendValueInput("NAME")
        .setCheck(null)
        .appendField(new Blockly.FieldTextInput("param"), "NAME");
    this.setOutput(true, null);
    this.setColour(230);
 this.setTooltip("");
 this.setHelpUrl("");
  }
Blockly.Blocks['equivalence'] = {
  init: function() {
    this.appendValueInput("NAME")
        .setCheck(null)
        .appendField("=");
    this.setOutput(true, null);
    this.setColour(230);
 this.setTooltip("");
 this.setHelpUrl("");
  }
};
Blockly.Blocks['parameter_var'] = {
  init: function() {
    this.appendDummyInput()
        .appendField(new Blockly.FieldVariable("item"), "NAME");
    this.setOutput(true, null);
    this.setColour(230);
 this.setTooltip("");
 this.setHelpUrl("");
  }
};
Blockly.Blocks['definition_call'] = {
  init: function() {
    this.appendValueInput("NAME")
        .setCheck(null)
        .appendField(new Blockly.FieldVariable("item"), "NAME");
    this.setInputsInline(true);
    this.setOutput(true, null);
    this.setColour(230);
 this.setTooltip("");
 this.setHelpUrl("");
  }
};

@asanzo
Copy link
Contributor

asanzo commented May 8, 2020

Yo revisaría bien https://github.com/Program-AR/proceds-blockly porque creo que procedures_defreturnsimplewithparams y procedures_callreturnsimplewithparams resuelven absolutamente todo lo que querés.

@asanzo
Copy link
Contributor

asanzo commented May 8, 2020

Junto con variables_get, por supuesto.

Selección_999(409)

Se puede sacar el "definir" de la izquierda y poner un "=" a la derecha del nombre de la función

@PalumboN
Copy link
Collaborator Author

Vamos con esto último que tiró @asanzo, toquetear el bloque para que quede piola.

@PalumboN
Copy link
Collaborator Author

Mirar cómo carajo se evalúa esto.

@PalumboN PalumboN self-assigned this Mar 16, 2021
@asanzo
Copy link
Contributor

asanzo commented Jun 13, 2022

Pensándolo mejor, yo NO haría este bloque y en su lugar:

  • Haría una definición con un nombre y sin parámetros. Es decir, tener el a = algo, y nada más. Cuando le pedís reducirse, no se reduce. Tiene una manito para obtener el "getter" de esa definición.
  • Al reducir el getter se reemplaza por el algo.
  • Haría una lambda (este laboratorio me la pide a gritos, es lo que le falta para poder usarlo para enseñar lambda cálculo), que tenga 1 text input con el nombre del parámetro, una manito para "obtener" ese parámetro, y un agujero para poner su definición. Al reducirse reduce lo que tiene en la definición, pero no desaparece, una lambda es una lambda siempre hasta que alguien la aplique.
  • De esta forma, si quiero construir una función de 2 parámetros estoy obligado a currificar a manopla.

Perdón, acabo de tener una charla sobre la materia teoría de lenguajes de la UNIPE con Vir Brassesco @princesamee y le propuse no dar Haskell y en su lugar usar este laboratorio de funciones, por lo que puede quizás parecer un poco "matematicoso" mi comentario 😆 .

Aunque no veo por qué no podrían existir ambos bloques.

Bah, en realidad si vamos por el lado de la "definición completa" , este bloque debería permitirme poner a la izquierda del "=" también constructores para usar de patrones....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants