Both sides previous revisionPrevious revisionNext revision | Previous revision |
teaching:cc4101:tareas:2015-2:tarea1 [2015/09/17 13:15] – [(4.0) Lenguaje Imperativo] 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 (list '("Scorsese" . 72 ) | > (groupby cdr |
'("Tarantino" . 53) | '(("Scorsese" . 72 ) |
'("John" . 19) | ("Tarantino" . 53) |
'("Peter" . 72) | ("John" . 19) |
'("Robert" . 19))) | ("Peter" . 72) |
| ("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 obtener la cantidad de parámetros que recibe la función ''%%f%%'', utilice la función ''%%procedure-arity%%'' provista en Racket. Asuma 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)))) |
> (((f 2) 5) 20) | > (((f 2) 5) 20) |
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).// |