Реализован Python-код лямбда-лифтинга по уроку Ghuloum, около 300 строк без S-выражений и энкодинга инструкций.
При лифтинге лямбд отслеживаются связанные и свободные переменные, а также накапливается глобальный список объектов кода.
Связывающие формы let и lambda распознаются для корректного обновления множества bound при рекурсивном обходе.
В теле lambda параметры считаются связанными, а любые переменные вне их списка считаются свободными и включаются в форму code.
Для каждой лямбды создаётся метка (label), формируется конструкция code с параметрами, списком свободных переменных и телом, а при использовании возвращается closure.
В let сначала преобразуются выражения привязок по исходному окружению, а новые имена учитываются только в теле выражения.
Примитивные операции не оборачиваются в funcall, а все прочие вызовы функций компилируются через формы funcall и labelcall.
Компиляция closure и funcall в ассемблере включает загрузку адреса метки, запись freevars в кучу, тегирование указателя, выравнивание и косвенный вызов.
Get notified when new stories are published for "Hacker News 🇷🇺 Русский"