Lisp-машина
Требования
Разработайте среду исполнения (runtime) Lisp. Трансляция должна осуществляться
одним из следующих способов:
- В объектный код (набор объектов JVM или другой или любой другой платформы).
Язык реализации можно выбрать любой. Самый простой вариант.
- В программу на языке C, Java байт-код, или Common Intemediate Language
(.NET), которая далее собирается стандартными средствами. Это более сложный
вариант.
- Непосредственно в нативный ассемблерный код. Самый сложный вариант,
рекомендуется только в случае, если хорошо владеете данным видом языка
ассемблера.
Реализация на языке среды исполнения (C, Java и т.д.) должна содержать минимальный набор элементов,
которые не могут быть выражены на самом Lisp, все остальные необходимые элементы языка должны быть
выражены в этом минимально базисе (определение функции, аппликация, определение списка, и ряд других).
Может быть реализовано подмножество любого диалекта Lisp (можете придумать свой), рекомендуется Scheme.
Необходимые элементы (не все они обязаны входить в базис):
- Определение функции
- Определение статического лексического контекста (let)
- Рекурсия
- Доступ к вызовам платформы (кроме native assembler)
- Ветвление, логические связки с отложенным порядком исполнения
- Цикл либо оптимизированная хвостовая рекурсия
- Присваивание для символов в определении let (императивный Lisp), либо для
отдельного примитива, аналогичного atom в Clojure (чисто функциональный Lisp)
- Макрос
- Ввод-вывод
Дополнительные требования
Определите следующие элементы:
- Генерация и обработка исключений (совместимых с исключениями платформы
исполнения)
- Для чисто-функционального Lisp: ленивые вычисления, отложенный порядок
вычислений для вызовов функций (в качестве прототипа см. Haskell)
- Динамические лексические контексты (по аналогии с binding в Clojure)
- Механизм, подобный макросу, но генерирующий не Lisp-код, а
непосредственно код для платформы исполнения
Рекомендации
Ознакомьтесь с главой 4 книги "Структура и интерпретация компьютерных программ"
(желательно и со всеми предыдущими главами, см. список литературы по курсу)