Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| teaching:cc4101:tareas:2016-1:tarea1 [2016/04/04 17:51] – fmosso | teaching: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: | + | Esta tarea se distribuye con un archivo zip {{:teaching: |
| * La **carpeta A** contiene 3 archivos: main.rkt, tests.rkt, y machine.rkt. Los archivos main.rkt y tests.rkt son incompletos, | * La **carpeta A** contiene 3 archivos: main.rkt, tests.rkt, y machine.rkt. Los archivos main.rkt y tests.rkt son incompletos, | ||
| Line 50: | Line 50: | ||
| (TFun (TFun (TNum) (TNum)) (TBool)) | (TFun (TFun (TNum) (TNum)) (TBool)) | ||
| - | > (parse-type '{{Num -> }) | + | > (parse-type '{Num -> }) |
| "Parse error" | "Parse error" | ||
| </ | </ | ||
| 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 '' | + | * (1.0) Implemente la función '' |
| * Para el if ambas ramas deben ser del mismo tipo, es decir al tipear '' | * Para el if ambas ramas deben ser del mismo tipo, es decir al tipear '' | ||
| * 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 < | + | "Type error in expression <E> position <n>: expected <T1> found < |
| </ | </ | ||
| 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 < | ||
| + | </ | ||
| + | |||
| + | 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 | + | "Type error in expression fun position |
| > (typeof (parse '{{fun {f : Num} : Bool #t} #t})) | > (typeof (parse '{{fun {f : Num} : Bool #t} #t})) | ||
| - | "Type error in expression app (position 2): expected Num, found 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" | ||
| </ | </ | ||
| - | * (0.2) Implemente la función '' | + | * (0.3) Implemente la función '' |
| <code scheme> | <code scheme> | ||
| Line 160: | Line 170: | ||
| > | > | ||
| '{Num -> Bool} | '{Num -> Bool} | ||
| + | |||
| + | > | ||
| + | "Type error in expression + position 2: expected Num found Bool" | ||
| > | > | ||
| - | "Type error in expression if (position 3): expected Num, found Bool" | + | "Type error in expression if position 3: expected Num found Bool" |
| </ | </ | ||
| - | * (0.1) Implemente la función '' | + | * (0.2) Implemente la función '' |
| 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. | ||
| - | |||

