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. | ||
- |