Entrega 0
deadline: 25 de Agosto 2024
⚠ Importante
Dado que esta entrega inicial es una introducción a OCaml, deberá ser realizada de manera individual. Es importante que cada uno tenga un buen manejo del lenguaje lo antes posible.
Recuerden las reglas del código de conducta.
Objetivos básicos de la entrega:
Tener un ambiente de desarrollo Ocaml funcional
Entender un código OCaml simple
Extender un interprete para un lenguaje con operaciones aritméticas, booleanos y funciones de primera clase
Distribución de puntaje:
5pts Spec básica.
1pt testing.
1pt calidad del código.
1 Para empezar
El código de referencia que tiene que usar está en la tarea de U-cursos.
Explore las carpetas, los distintos archivos, y asegúrese de poder ejecutar
el interprete, los tests, y de poder probar el interprete de manera interactiva en utop
.
Vean el video de introducción. Cualquier pregunta, usen el foro de U-cursos.
2 Simplificaciones de Expresiones Aritméticas
Añada a interp.ml
una función
simplify : exp -> exp
que dada una expresión, retorna la expresión que resulta de aplicar las simplificaciones definidas por las siguientes ecuaciones:
x + 0 = x = 0 + x
1 * x = x = x * 1
¡No se olvide de escribir los tests! También adapte las simplificaciones cuando la representación de exp
cambia.
3 Extensiones del Intérprete
Siguiendo el ejemplo de este interprete en Racket, extienda el lenguaje con:
Un tipo de valor booleano, con elementos true y false, y una expresión (if bool-cond branch-true branch-false). Puede tener los valores true o false (sin mayúsculas)
Otras operaciones aritméticas
-
y/
, booleanasnot
yand
, y comparaciones entre enteros<
y=
. Nota: La evaluación de la expresiónand
debe realizarse siguiendo la semántica corto-circuital. Es decir, si el primer operando esfalse
, no debería evaluarse el segundo.Let-bindings (let* ((var expr) ...) body), por ejemplo
(let* ((x 2) (y 1)) (+ x y)) (Recuerde: un let* con varios identificadores es equivalente a varios let unarios anidados.)
Funciones de primera clase:
(let ((f (fun (x) (+ 3 x))) (g (fun (y) (* 7 y)))) (g (f 3))) (let ((addn (fun (n) (fun (m) (+ n m))))) ((addn 10) 2)) Nota: Pueden implementar los let-bindings como azúcar sintáctico para aplicación de lambda.
¡No se olvide de escribir los tests!
4 Mecanismo de Entrega
Para esta entrega individual debe subir a la tarea en UCursos:
Un único archivo
zip
con todo su directorio de trabajo, incluyendo los tests, y un archivo de texto/markdownENTREGA0.md
describiendo brevemente lo que intentaron y lograron hacer, y qué cosas testearon.