Open Mazdaywik opened 5 years ago
Задача очень соблазнительная, но с ней придётся повременить.
В ближайшем будущем планируется эксперимент по распараллеливанию Рефала-05, а распараллелить версию с рекурсивным вызовом рефал-машины будет существенно сложнее.
Эта задача — подзадача #33.
Мотивация
С условиями и блоками проще программировать. Добавить их в back-end и рантайм технически не сложно.
Реализация
Компиляция условий
Рассмотрим компиляцию условия:
В этом случае псевдокод предложения будет иметь вид:
Здесь я намеренно написал не
〈сопоставление с P〉
, а〈сопоставление с <F P>〉
, дабы подчеркнуть, что первой операцией выделяется аргумент из диапазона [arg_begin
,arg_end
]. Аналогичное действие применяется к сопоставлению с образцом условия.Функция
F$1
, будучи вызванной, прерывает цикл работы рефал-машины.Компиляция блоков
Рассмотрим блок:
Псевдокод предложения:
Выводы
Изменения рантайма минимальные — нужна функция для рекурсивного вызова рефал-машины и тело для функций
F$1
. На этапе кодогенерации потребуется некоторое количество работы. На этапе синтаксического анализа делать ничего не надо — см. #34.