Both sides previous revisionPrevious revisionNext revision | Previous revision |
teaching:cc4101:tareas:2022-1:tarea1 [2022/04/06 22:35] – [Parte 2. Verificación estática de tipos (2.5 ptos.)] tdiaz | teaching:cc4101:tareas:2022-1:tarea1 [2022/04/19 18:54] (current) – etanter |
---|
</code> | </code> |
| |
En el BNF utilizamos ''[ ]'' para denotar que algo es opcional. Note que ''%%with%%'' no incluye anotación del tipo del cuerpo y que los tipos de los identificadores son opcionales. Igualmente, el tipo de retorno de una función es opcional, pero el de cada argumento **sí** es necesario. | En el BNF utilizamos ''[ ]'' para denotar que algo es opcional. Note que ''%%with%%'' no incluye anotación del tipo del cuerpo y que los tipos de los identificadores son opcionales. Igualmente, el tipo de retorno de una función es opcional, pero el de cada argumento **sí** es necesario. Para funciones recursivas, pueden asumir que el tipo de retorno tiene que ser especificado. |
| |
Los programas siguientes están bien tipados: | Los programas siguientes están bien tipados: |
Ahora vamos a añadir verificación dinámica mediante contratos a las funciones de nuestro lenguaje. El único cambio en la sintaxis del lenguaje se ve reflejado en la definición de funciones, donde ahora se puede definir además un contrato para cada argumento: | Ahora vamos a añadir verificación dinámica mediante contratos a las funciones de nuestro lenguaje. El único cambio en la sintaxis del lenguaje se ve reflejado en la definición de funciones, donde ahora se puede definir además un contrato para cada argumento: |
<code scheme> | <code scheme> |
<fundef> ::= {define {<id> <arg>*} : <type> <expr>} ; como antes | <fundef> ::= {define {<id> <arg>*} [: <type>] <expr>} ; como antes |
<arg> ::= {<id> : <type>} ; como antes | <arg> ::= {<id> : <type>} ; como antes |
| {<id> : <type> @ <contract>} ; lo único nuevo | | {<id> : <type> @ <contract>} ; lo único nuevo |
En esta parte, su función ''run'' debe hacer lo mismo que en la parte 2. Solamente que la interpretación ahora incluye verificar contratos. | En esta parte, su función ''run'' debe hacer lo mismo que en la parte 2. Solamente que la interpretación ahora incluye verificar contratos. |
| |
**Instrucciones**: | **Observaciones importantes**: |
* En el intérprete, cuando se efectúa una aplicación de función, se tiene que verificar que sus argumentos cumplan con los contratos declarados (de existir -- sino, procede como antes). | * En el intérprete, cuando se efectúa una aplicación de función, se tiene que verificar que sus argumentos cumplan con los contratos declarados (de existir -- sino, procede como antes). |
* Cuando el contrato no se cumpla, el patrón de error es: <code scheme> | * Cuando el contrato no se cumpla, el patrón de error es: <code scheme> |
"Runtime contract error: <v> does not satisfy <contract>" | "Runtime contract error: <v> does not satisfy <contract>" |
</code> donde ''<v>'' es el valor al que se le aplicó el contrato <contract> el nombre de este. | </code> donde ''<v>'' es el valor al que se le aplicó el contrato <contract> el nombre de este. |
* Una función usada como contrato *debe* aceptar un solo argumento de cualquier tipo válido y *debe* retornar un valor de tipo ''Bool''. Sino, el patrón de error es : <code scheme> | * Una función usada como contrato **debe** aceptar un solo argumento de cualquier tipo válido y **debe** retornar un valor de tipo ''Bool''. Sino, el patrón de error es : <code scheme> |
"Static contract error: invalid type for <c>" | "Static contract error: invalid type for <c>" |
</code> donde ''<c>'' es el nombre del contrato que no tipa. | </code> donde ''<c>'' es el nombre del contrato que no tipa. |