| Both sides previous revisionPrevious revisionNext revision | Previous revision | 
| teaching:cc4101:tareas:2015-2:tarea1 [2015/09/17 13:26]  – [(2.0) Programación funcional]  etanter | teaching:cc4101:tareas:2015-2:tarea1 [2015/09/17 14:23] (current)  – [(4.0) Lenguaje Imperativo]  flarenas | 
|---|
|   - (0.5) Implemente la función ''%%(repeat lst k)%%'' que repite los elementos de una lista k veces usando ''%%foldr%%'', ''%%map%%'' y la función ''%%range%%'' vista en la Auxiliar 1. Ejemplo: <code scheme> |   - (0.5) Implemente la función ''%%(repeat lst k)%%'' que repite los elementos de una lista k veces usando ''%%foldr%%'', ''%%map%%'' y la función ''%%range%%'' vista en la Auxiliar 1. Ejemplo: <code scheme> | 
| > (repeat '(a b c) 3)                        | > (repeat '(a b c) 3)                        | 
| '(a a a b b b c c cT) | '(a a a b b b c c c) | 
| </code> | </code> | 
 |   | 
|   - (0.7) Defina una función ''%%(groupby selector lst)%%'' que permita agrupar los elementos de una lista basado en un criterio de selección. Ejemplos: <code scheme> |   - (0.7) Defina una función ''%%(groupby selector lst)%%'' que permita agrupar los elementos de una lista basado en un criterio de selección. Ejemplos: <code scheme> | 
| > (groupby cdr  | > (groupby cdr  | 
|            (list '("Scorsese" . 72 )   |            '(("Scorsese" . 72 )   | 
|                  '("Tarantino" . 53)  |              ("Tarantino" . 53)  | 
|                  '("John" . 19)  |              ("John" . 19)  | 
|                  '("Peter" . 72)  |              ("Peter" . 72)  | 
|                  '("Robert" . 19)))                    |              ("Robert" . 19)))                    | 
| '((72 ("Scorsese" . 72) ("Peter" . 72)) | '((72 ("Scorsese" . 72) ("Peter" . 72)) | 
|   (53 ("Tarantino" . 53)) |   (53 ("Tarantino" . 53)) | 
 |  | 
| > (groupby (λ (x) (modulo (string->number x) 3)) | > (groupby (λ (x) (modulo (string->number x) 3)) | 
|            (list "21" "5" "34" "5" "89" "47" "28"))                     |            '("21" "5" "34" "5" "89" "47" "28"))                     | 
| '((0 "21") (2 "5" "5" "89" "47") (1 "34" "28")) | '((0 "21") (2 "5" "5" "89" "47") (1 "34" "28")) | 
| </code> | </code> | 
 |   | 
|   - (0.8) Utilizando la función ''%%(apply fun args)%%''  de Racket,  implemente la función ''%%(curry-n f)%%'' que dado una función ''f'' retorna su versión currificada. Para determinar la cantidad de parámetros que espera la función ''%%f%%'', utilice la función ''%%procedure-arity%%'' provista en Racket (puede asumir que la función ''%%f%%'' recibe un número fijo de parámetros). Ejemplos: <code scheme> |   - (0.8) Utilizando la función ''%%(apply fun args)%%''  de Racket,  implemente la función ''%%(curry-n f)%%'' que dado una función ''f'' retorna su versión currificada. Para determinar la cantidad de parámetros que espera la función ''%%f%%'', utilice la función ''%%procedure-arity%%'' provista en Racket (puede asumir que la función ''%%f%%'' recibe un número fijo de parámetros). Ejemplos: <code scheme> | 
| > (define f (curry-n (λ (x y z) (+ x y z))))                                                   | > (define f (curry-n (λ (x y z) (+ x y z))))                                                   | 
| 3628800 | 3628800 | 
| </code> | </code> | 
|   * (0.5) Defina la gramática BNF del lenguaje, realizando una clara distinción entre programas (''Prog''), instrucciones (''Instr'') y expresiones (''Expr''). Considere las siguientes operaciones aritméticas: + - *.  |   - (0.5) Defina la gramática BNF del lenguaje, realizando una clara distinción entre programas (''Prog''), instrucciones (''Instr'') y expresiones (''Expr''). Considere las siguientes operaciones aritméticas: + - *.  | 
|   * (0.5) Defina (usando ''deftype'') las estructuras de datos necesarias para poder construir una representación de la sintaxis abstracta de un programa.  |   - (0.5) Defina (usando ''deftype'') las estructuras de datos necesarias para poder construir una representación de la sintaxis abstracta de un programa.  | 
|   * (0.5) Defina un parser para el lenguaje.  |   - (0.5) Defina un parser para el lenguaje.  | 
|   * (1.0) Defina un interprete para el lenguaje, usando una tabla de hash global para manejar el estado de las variables.   |   - (1.0) Defina un interprete para el lenguaje, usando una tabla de hash global para manejar el estado de las variables.   | 
|   * (0.5) Defina la función ''run :: Prog → Num'' que ejecuta un programa y retorna el valor de una expresión ''return'', o un error si corresponde.  |   - (0.5) Defina la función ''run :: Prog → Num'' que ejecuta un programa y retorna el valor de una expresión ''return'', o un error si corresponde.  | 
|   * (1.0) Para evitar errores de variables ya definidas y/o no definidas, defina una función ''var-check :: Prog → List[string]'' que analiza el programa (sin ejecutarlo!), y retorna una lista de los errores de variables presentes en el programa. Si el programa no contiene errores, retorna la lista vacía.  |   - (1.0) Para evitar errores de variables ya definidas y/o no definidas, defina una función ''var-check :: Prog → List[string]'' que analiza un programa (sin ejecutarlo!), y retorna una lista de los errores de variables presentes en el programa. Si el programa no contiene errores, retorna la lista vacía.  | 
| //Nota: recuerden que para definir una función que procesa una estructura compuesta, tienen que usar funciones auxiliares para los sub-componentes (aquí, programas, instrucciones, expresiones).// | //Nota: recuerden que para definir una función que procesa una estructura compuesta, tienen que usar funciones auxiliares para los sub-componentes (en el contexto de la tarea: programas, instrucciones, expresiones).// |