Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
teaching:cc4101:tareas:2015-2:tarea1 [2015/09/17 10:03] – [(2.0) Programación funcional] etanterteaching:cc4101:tareas:2015-2:tarea1 [2015/09/17 11:23] (current) – [(4.0) Lenguaje Imperativo] flarenas
Line 7: Line 7:
   - (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.5) 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))
Line 21: Line 21:
  
 > (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 currificadaPara 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.5) Utilizando la función ''%%(apply fun args)%%''  de Racket,  implemente la función ''%%(curry-n fun n)%%'' que dado una función de n argumentos retorna su versión currifidaEl parámetro n representa la cantidad de parámetros que recibe la función ''%%fun%%''. Asuma que la función ''%%fun%%'' recibirá exactamente n paramétros. Ejemplos: <code scheme> +> (define f (curry-n (λ (x y z) (+ x y z))))                                                  
-> (define f (curry-n (λ (x y z) (+ x y z)) 3))                                                  +
 > (((f 2) 5) 20) > (((f 2) 5) 20)
 27 27
  
-> (define g (curry-n (λ (x) (* x x)) 1))+> (define g (curry-n (λ (x) (* x x))))
 > (g 3) > (g 3)
 9 9
  
-> (define y (curry-n (λ () (* 20 5)) 0))+> (define y (curry-n (λ () (* 20 5))))
 > (y) > (y)
 100 100
 </code> </code>
 +//Nota: obviamente, no pueden usar la función ''curry'' de Racket!//
 ===== (4.0) Lenguaje Imperativo ===== ===== (4.0) Lenguaje Imperativo =====
  
Line 45: Line 44:
   * ''%%{var id e}%%'': Define la variable global de nombre ''id'' y le asocia el valor de la expresion ''e''. Si la variable que se está intentando definir ya fue previamente definida por una instrucción ''var'', se debe arrojar el error "variable already defined".   * ''%%{var id e}%%'': Define la variable global de nombre ''id'' y le asocia el valor de la expresion ''e''. Si la variable que se está intentando definir ya fue previamente definida por una instrucción ''var'', se debe arrojar el error "variable already defined".
   * ''%%{set id e}%%'': Reasigna la variable de nombre ''id'' con el valor de la expresión ''e''. Si se realiza una asignación a una variable que no haya sido previamente definida por una instrucción ''var'', se debe arrojar el error "free variable".   * ''%%{set id e}%%'': Reasigna la variable de nombre ''id'' con el valor de la expresión ''e''. Si se realiza una asignación a una variable que no haya sido previamente definida por una instrucción ''var'', se debe arrojar el error "free variable".
-  * ''%%{while-nz e exprs}%%'': Corresponde al control que flujo que ejecuta ''exprs'' siempre y cuando el valor de la expresión ''e'' no sea cero.+  * ''%%{while e exprs}%%'': Ejecuta ''exprs'' siempre y cuando el valor de la expresión ''e'' no sea cero.
   * ''%%{return e}%%'': Instrucción que detiene la ejecución y retorna el valor de la expresión ''e''. En todo programa la última expresión debe ser ''return'', en caso contrario se debe arrojar el error "no return expression found".   * ''%%{return e}%%'': Instrucción que detiene la ejecución y retorna el valor de la expresión ''e''. En todo programa la última expresión debe ser ''return'', en caso contrario se debe arrojar el error "no return expression found".
  
-Considere que los programas tienen una memoria global que es implementada con una tabla de hash donde cada ''id'' se asocia a un valor. Refierase al [[http://docs.racket-lang.org/reference|manual de Racket]] para obtener información acerca de cómo utilizar tablas de hash en Racket. A modo de ejemplo, considere los siguientes programas implementados en nuestro lenguaje imperativo:+Considere que los programas tienen una memoria global mutable que es implementada con una tabla de hash donde cada ''id'' se asocia a un valor. Refierase al [[http://docs.racket-lang.org/reference|manual de Racket]] para obtener información acerca de cómo utilizar tablas de hash en Racket.  
 + 
 +A modo de ejemplo, considere los siguientes programas implementados en nuestro lenguaje imperativo:
  
 <code scheme> <code scheme>
Line 59: Line 60:
          {var Y 1}          {var Y 1}
          {var Z X}          {var Z X}
-         {while-nz Z+         {while Z
            {{set Y {* Y Z}}            {{set Y {* Y Z}}
             {set Z {- Z 1}}}}             {set Z {- Z 1}}}}
Line 65: Line 66:
 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''la estructura de dato del árbol de sintaxis abstracta +  (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 de programas. Use funciones auxiliares para reflejar los distintos non-terminales de la gramática+  (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. No se olviden de usar funciones auxiliares que reflejen la gramática+  (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 (en el contexto de la tarea: programas, instrucciones, expresiones).//