uqbar-project / function-laboratory

https://uqbar-project.github.io/function-laboratory/
GNU General Public License v3.0
3 stars 2 forks source link

Refactor block reduction #47

Closed JuanFdS closed 3 years ago

JuanFdS commented 3 years ago

Sugerencia para le reviewer

Es un refactor un poco violento con varios cambios, creo que aunque son muchos commits esta mas facil revisar por commit para entender como fue el camino del refactor porque la mayoría son pasos chiquitos y atomicos.

Qué

El objetivo del PR es simplificar la firma de los bloques que creamos para que en vez de pasarle una funcion que tenga que encargarse de ir a buscar bloques y crear un bloque nuevo le pasemos una que solo necesite conocer que parametros espera la funcion representada por el bloque y que valor debe devolver.

Ademas, se tuneó un poco como se reducen los bloques para permitir reducir bloques mas complejos aplicados parcialmente:

coso

Como

Ahora al crear un bloque hay que pasar un parametro evaluation en vez de getResultBlock.

Lo principal de este PR es que ahora no se necesita obtener un bloque reducido como paso intermedio como antes, si no que ahora el codigo se basa en que a un bloque se le puede pedir getValue() que devuelve un valor en javascript que representa el valor actual del bloque. Y además, ese getValue() puede retornar una funcion, entonces cuando un bloque esta parcialmente aplicado devuelve la funcion parcialmente aplicada correspondiente.

Aplicando Parcialmente

Para poder implementar esto creé un archivo separado: partialApply.js, que provee partialApply que recibe una lista de argumentos y una funcion y le aplica esos argumentos a la funcion. El truco que tiene es que si se pasa ___ (un objeto definido en ese archivo) como parametro, se obtiene una funcion que espera por ese parametro. Por ej:

> partialApply(_, 5)(x => y => x - y)

devuelve una funcion que espera un numero y cuando lo reciba va a devolver ese numero - 5.

Esto solo funciona con funciones que esperan recibir de a un parametro a la vez y que estan currificadas, así que las funciones que le pasemos a los bloques van a tener que cumplir eso.

JuanFdS commented 3 years ago

Ahí pusheé varios de los cambios, esto solo no lo corregí porque no estaba seguro que era lo mejor a hacer en ese caso 🤔 https://github.com/uqbar-project/function-laboratory/pull/47#discussion_r611121999

Si te convence como esta ahora mergealo nomas :D

JuanFdS commented 3 years ago

@PalumboN ah me falto pingearte (? ^

PalumboN commented 3 years ago

@JuanFdS mergié! :clap: :clap: :clap:
(El test que comentamos lo podemos ver más adelante, no creo que influya mucho).