lintMap

lintMap

de Nicolas Grosso San Roman -
Número de respuestas: 4

Hola!

Estaba implementando este linting y me encontré con algunas dudas. Trataré de ser lo más general posible para no estar diciendo posibles soluciones.

Es el primer linting donde me ocurre que debo saber el nombre de la función (no función lambda, sino como la que está en el ejemplo). Hasta ahora mis lintings recibían expresiones Expr, desentendiendose del nombre de la función, y vienen funcionando bien. Sin embargo, pensé en darle como argumento a lintMap algo de la forma FuncDef, donde ahí sí logro conocer el nombre de la función para saber si estoy llamando a la función recursivamente en el último caso del case. 

Pero esta forma de pasarle un FuncDef como argumento me parece rara: primero porque como dije, mis lintings reciben Expr, y segundo porque no termino de comprender cómo en Linter.hs se procesan los lintings. Es decir, si hago que lintMap reciba una función como argumento, no veo la manera de que se procese bien por el Linter.hs. 

Agradezco cualquier aclaración, y entendería si creen que la respuesta a ésta pregunta es dar la solución.

Saludos!



En respuesta a Nicolas Grosso San Roman

Re: lintMap

de Marcos Viera - InCo -
Hola,

A diferencia de los otros lintings, que tienen tipo (Linting Expr), lintMap tiene tipo (Linting FunDef).
Es decir que es una función: FunDef -> (FunDef, [LintSugg]).

Lo que se hace en Linter.hs es básicamente pasar todos los demás lintings de lintings de expresiones a lintings de definiciones de funciones, usando liftToFunc:

allLints =
liftToFunc lintComputeConstant
>==> liftToFunc lintRedBool
>==> liftToFunc lintRedIfCond
>==> liftToFunc lintRedIfAnd
>==> liftToFunc lintRedIfOr
>==> liftToFunc lintNull
>==> liftToFunc lintAppend
>==> liftToFunc lintComp
>==> liftToFunc lintEta
>==> lintMap

saludos
En respuesta a Marcos Viera - InCo

Re: lintMap

de Nicolas Grosso San Roman -
Ahora me surgió otra duda.
Yo recibo:

(FunDef nombre expr) y se llama a lintMap con eso. Luego, por ejemplo, si se entra en este linting con una expresión expr de la forma (Infix op expr1 expr2) (por decir alguna, puede ser otro tipo), no puedo llamar a la recursión para cada expr1 y expr2 pues no son FunDef.

Esto me lleva a las siguientes preguntas:

1. no se debe considerar la recursión dentro de este linting?
2. cuando este linting recibe una función, asumimos que es de la forma que se presenta en la letra? es decir, no van a haber funciones que tengan un case de ese estilo que estén dentro de otra expresión?

Entiendo que la respuesta a la segunda pregunta puede ser media obvia ya que si el esquema del case ocurre dentro de una expresión más grande, entonce no se la podría definir como FunDef, pero de todas formas pregunto por las dudas.

Gracias!
En respuesta a Nicolas Grosso San Roman

Re: lintMap

de Marcos Viera - InCo -
Hola,

Este linting no es recursivo, dado que el esquema se tiene que dar para toda la definición de la función.
Creo que con la respuesta anterior también queda respondido 2, pero igual, por las dudas, la respuesta es que no.

saludos