9.1

Entrega 0🔗

deadline: 23 de Agosto 2026

⚠ 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 /, booleanas not y and, y comparaciones entre enteros <= y =. Nota: La evaluación de la expresión and debe realizarse siguiendo la semántica corto-circuital. Es decir, si el primer operando es false, 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/markdown ENTREGA0.md describiendo brevemente lo que intentaron y lograron hacer, y qué cosas testearon.