Mazdaywik / Refal-05

Очень минималистичный компилятор Рефала
https://mazdaywik.github.io/Refal-05/
Other
3 stars 2 forks source link

Поддержка встроенных функций Рефала-5 #12

Closed Mazdaywik closed 5 years ago

Mazdaywik commented 6 years ago

Эта задача — подзадача для #2.

В рамках данной задачи необходимо реализовать встроенные функции Рефала-5 в том объёме, которого достаточно для самоприменения. Дублирующие старые функции Простого Рефала следует безжалостно удалять. И скорее всего, под нож бритву Оккама пойдёт вся библиотека Простого Рефала кроме функций арифметики.

Задачи точного повторения семантики не ставится, достаточно реализации в минимальном объёме. В частности, арифметические функции должны уметь работать только с парой макроцифр чисел, результат выхода за границы не определён (будет реализовано заворачивание, как в раннем Простом Рефале).

Должны быть доступны все встроенные функции, поддерживаемые версией PZ Oct 29 2004, большинство из них допустимо реализовать как $EENUM.

Полный список и тонкости семантики встроенных функций описаны в bmstu-iu9/refal-5-lambda#102.

Mazdaywik commented 5 years ago

Подход к реализации встроенных функций

При инициализации таблицы функций (SymTable.ref) в неё помещаются все имена функций, которые возвращает ListOfBuiltin, как внешние имена (неявный $EXTERN). За избыточные extern’ы компилятор Си не карает, поэтому лишние записи — не проблема.

При компиляции и запуске refc/refgo имена ListOfBuiltin нужно фильтровать — есть одна пустая строчка и есть две функции со знаками $. Функция ListOfBuiltin Рефала-05 не будет возвращать эти имена. Остальные имена присутствовать будут, но они по большей части будут описаны как $EENUM.

Рефал-5 запрещает определять функции с теми же именами, что и встроенные. Рефал-05 будет разрешать (ведь иначе их не опишешь в Library.ref).