Создайте директорию (на основе Lambda) со своей фамилией и там пишите
| Макс оценка | Название | |
|---|---|---|
| D | Интерпретатор miniML | |
| A-C | Продвинутый интерпретатор |
Задача на одинаковая каждому, сдавать понимание кода надо очно пулу принимающих.
Нужно реализовать интерпретатор miniML с лямбдами и арифметикой.
- Рекурсивные функции (с fix и с let rec), CBV. Идентификаторы как в OCaml
- Целые числа и операции над ними; считаем, что if ожидает целочисленное условие, что будет true, а что false --- выберите сами
- Не нужно
- Тайпчекер
- списки и энки будут на оценку выше
- строки
- В идеале какой-нибудь сахар для функций:
fun x y -> ...вместоfun x -> fun y -> ... - Стандартная функция, чтобы печатать числа в ответе и по ходу дела.
- Интерпретатор не должен падать, используйте монады для обработки ошибок.
- Интерпретатор можно реализовывать рекурсивно, либо с помощью компиляции в абстарктную машину.
- Для рекурсивного интерпретатора не нужно делать разделения на рекурсивные и нерекурсивные замыкания.
- Тестирование
- Парсера и принтера программ через QuickCheck
- Самого интерпретатора через cram тесты. Как минимум интерпретатор должен быть способен вычислять факториалы и числа Фибоначчи, с let rec и с комбинатором неподвижной точки для стратегии CBV.
- Учет максимального количества шагов интерпретатора, чтобы тестировать зависающие программы.
- Человек должен быть способен объявлять свои функции с такими же именами (например, print или fix), как встроенные.
- Некорректные программы не должны работать
- например, если опущен пробел между let и rec, то это перестает быть двумя ключевыми словами, а становится идентификатором.