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:2016-1:tarea1 [2016/04/04 17:51] fmossoteaching:cc4101:tareas:2016-1:tarea1 [2016/04/17 00:03] (current) – [Tarea 1 (Entrega: 20 de Abril 2016)] fmosso
Line 2: Line 2:
  
  
-Esta tarea se distribuye con un archivo zip {{teaching:cc4101:201601-tarea1-base.zip|}} que contiene **3 carpetas A, B, y C**, correspondientes a los conjuntos de archivos que tienen que entregar. Noten que la carpeta C es para entregar la pregunta opcional (bonus) descrita al final de la tarea.+Esta tarea se distribuye con un archivo zip {{:teaching:cc4101:tareas:2016-1:2016-tarea1ver2.zip|}} que contiene **3 carpetas A, B, y C**, correspondientes a los conjuntos de archivos que tienen que entregar. Noten que la carpeta C es para entregar la pregunta opcional (bonus) descrita al final de la tarea.
  
     * La **carpeta A** contiene 3 archivos: main.rkt, tests.rkt, y machine.rkt. Los archivos main.rkt y tests.rkt son incompletos, y en ellos tienen que implementar lo que se solicita en las preguntas 1, 2, y 3. **No deben modificar el archivo machine.rkt**: es una implementación completa de la máquina a la cual van a compilar su lenguaje.     * La **carpeta A** contiene 3 archivos: main.rkt, tests.rkt, y machine.rkt. Los archivos main.rkt y tests.rkt son incompletos, y en ellos tienen que implementar lo que se solicita en las preguntas 1, 2, y 3. **No deben modificar el archivo machine.rkt**: es una implementación completa de la máquina a la cual van a compilar su lenguaje.
Line 50: Line 50:
 (TFun (TFun (TNum) (TNum)) (TBool)) (TFun (TFun (TNum) (TNum)) (TBool))
  
-> (parse-type '{{Num ->  })+> (parse-type '{Num ->  })
 "Parse error" "Parse error"
 </code> </code>
Line 125: Line 125:
  
  
-===== 3. Verificación de Tipos [1pt] =====+===== 3. Verificación de Tipos [1.5pt] =====
 Se implementará el chequeo de tipos de una expresión en presencia de funciones de primera clase. Se implementará el chequeo de tipos de una expresión en presencia de funciones de primera clase.
-  * (0.7) Implemente la función ''%%(typeof expr)%%'' que calcula el tipo de la expresión dada o falla con un mensaje de error en caso de que la expresión no sea valida. Para la validación, considere lo siguiente:+  * (1.0) Implemente la función ''%%(typeof expr)%%'' que calcula el tipo de la expresión dada o falla con un mensaje de error en caso de que la expresión no sea valida. Para la validación, considere lo siguiente:
      * Para el if ambas ramas deben ser del mismo tipo, es decir al tipear ''%%{if #t 1 6}%%'' debe ser del tipo TNum, en cambio ''%%{if #t 1 #f}%%'' debe retornar un mensaje de error           * Para el if ambas ramas deben ser del mismo tipo, es decir al tipear ''%%{if #t 1 6}%%'' debe ser del tipo TNum, en cambio ''%%{if #t 1 #f}%%'' debe retornar un mensaje de error     
      * Para una función con el tipo de retorno anotado, se válida que la expresión del cuerpo tenga el mismo tipo que el tipo de retorno declarado.      * Para una función con el tipo de retorno anotado, se válida que la expresión del cuerpo tenga el mismo tipo que el tipo de retorno declarado.
Line 135: Line 135:
 Los mensaje de error de tipo tienen que seguir el siguiente patrón:  Los mensaje de error de tipo tienen que seguir el siguiente patrón: 
 <code scheme> <code scheme>
-"Type error in expression <E> (position <n>): expected <T1>found <T2>"+"Type error in expression <E> position <n>: expected <T1> found <T2>"
 </code> </code>
  
  donde E es la expresión donde ocurrió el error, n es la sub-expresión donde se manifestó, T1 es el tipo esperado y T2 el tipo encontrado.  donde E es la expresión donde ocurrió el error, n es la sub-expresión donde se manifestó, T1 es el tipo esperado y T2 el tipo encontrado.
 +
 +Para el caso cuando hay algún identificador libre, el patrón es:
 +<code scheme>
 +"Type error in expression id position 1: No type for identifier <x>"
 +</code>
 +
 + donde <x> es el identificador libre
 +
 por ejemplo: por ejemplo:
    
Line 147: Line 155:
   (TFun (TNum) (TBool))   (TFun (TNum) (TBool))
   > (typeof (parse '{fun {f : Num} : Bool 10}))   > (typeof (parse '{fun {f : Num} : Bool 10}))
-  "Type error in expression fun (position 1): expected Boolfound Num"+  "Type error in expression fun position 3: expected Bool found Num"
   > (typeof (parse '{{fun {f : Num} : Bool #t} #t}))   > (typeof (parse '{{fun {f : Num} : Bool #t} #t}))
-  "Type error in expression app (position 2): expected Numfound Bool"  +  "Type error in expression app position 2: expected Num found Bool
 +  > (typeof (parse 'y)) 
 +  "Type error in expression id position 1: No type for identifier: y"  
   </code>   </code>
  
-    * (0.2) Implemente la función ''%%(typecheck s-expr)%%'' que retorna el tipo de un programa, en un formato legible:+    * (0.3) Implemente la función ''%%(typecheck s-expr)%%'' que retorna el tipo de un programa, en un formato legible:
    
 <code scheme>  <code scheme> 
Line 160: Line 170:
 >(typecheck  '{fun {f : Num} : Bool #t}) >(typecheck  '{fun {f : Num} : Bool #t})
 '{Num -> Bool} '{Num -> Bool}
 +
 +>(typecheck  '{+ 2 #t})
 +  "Type error in expression + position 2: expected Num found Bool"
  
 >(typecheck  '{if #t 1 #t}) >(typecheck  '{if #t 1 #t})
-  "Type error in expression if (position 3): expected Numfound Bool"+  "Type error in expression if position 3: expected Num found Bool"
  
 </code>     </code>    
  
-  * (0.1) Implemente la función ''%%(typed-compile s-expr)%%'' que se encarga de todo el proceso de generación de código desde un programa, considerando el parsing, la validación de tipos, y la transformación con índices De Bruijn. Note que esta función solo genera código de maquina si la expresión esta bien tipada, sino produce el error correspondiente.+  * (0.2) Implemente la función ''%%(typed-compile s-expr)%%'' que se encarga de todo el proceso de generación de código desde un programa, considerando el parsing, la validación de tipos, y la transformación con índices De Bruijn. Note que esta función solo genera código de maquina si la expresión esta bien tipada, sino produce el error correspondiente.
  
  
Line 223: Line 236:
  
 Para evitar que una coerción invalida lleve la máquina de ejecución a un estado errado, se le pide que modifiquen su tarea para que las coerciones sean safe: tal como un cast en Java, se verifica dinámicamente que el tipo real del valor es compatible con el tipo de la coerción. Para evitar que una coerción invalida lleve la máquina de ejecución a un estado errado, se le pide que modifiquen su tarea para que las coerciones sean safe: tal como un cast en Java, se verifica dinámicamente que el tipo real del valor es compatible con el tipo de la coerción.
-