Skip to content

Прогонка и встраивание функций в Рефале-5λ #122

@Mazdaywik

Description

@Mazdaywik

Эта задача — подзадача для #91. Подробнее о встраивании и прогонке см. в #91.

Основные расширения синтаксиса

  1. Добавить синтаксис во front-end Простого Рефала, позволяющий отдельно задавать свойства функций в виде списка имён ($ENTRY, $INLINE и т.д.)
Foo {
  …
}

Bar {
  …
}

$ENTRY Foo, Bar;
$INLINE Bar;
  1. Во front-end’е Простого Рефала добавить поддержку ключевого слова $INLINE перед именем функции (по аналогии с $ENTRY):
$INLINE Apply { … }
  1. Во front-end’е Рефала-5λ добавить псевдокомментарий *$INLINE (уточнение: эту часть задачи делаю я, @Mazdaywik):
*$INLINE Foo, Bar;
  1. Реализовать поддержку встраивания функций как один из проходов обессахаривателя. Семантика встраивания достаточно подробно описана в задаче Встраивание и специализация функций в Рефале-5λ #91.

Нюанс — встраивание и прогонка

В задаче #91 предлагается реализовать механизм прогонки с расщеплением предложений:

$INLINE Foo {
  s.X = s.X s.X
  ((e.Y)) = (((e.Y)));
}

Bar {
  t.X = #A;
  t.X t.Y t.Z = <Foo t.Y>;
  e.K = #B;
}

 ↓ ↓ ↓

Bar {
  t.X = #A;
  t.X s.X1 t.Z = s.X1 s.X1;
  t.X ((e.Y1)) t.Z = (((e.Y1)));
  t.X t.Y t.Z = <Foo1 t.Y>;
  e.K = #B;
}

$ENUM Foo1;

Достоинство данного механизма: повышается глубина оптимизации. Недостаток — для рекурсивных встраиваемых функций он будет зацикливаться. Поэтому предлагается ввести два ключевых слова: $INLINE для простого встраивания (не меняющего левую часть) и $DRIVE для прогонки (соответственно, *$INLINE и *$DRIVE для Рефала-5λ).

Список литературы

Теоретической основой данной задачи являются прежде всего две работы Турчина.

  • В. Ф. Турчин. Эквивалентные преобразования рекурсивных функций, описанных на языке РЕФАЛ. В cб.: Труды симпозиума “Теория языков и методы построения систем программирования”, Киев-Алушта: 1972. Стр. 31-42. (djvu скан), (pdf скан), (djvu LaTeX), (pdf LaTeX)
  • В. Ф. Турчин. Эквивалентные преобразования программ на РЕФАЛе. В cб.: Труды ЦНИПИАСС “Автоматизированная система управления строительством”, выпуск 6, М: 1974. Стр. 36-68. (djvu), (pdf).

Следует иметь ввиду, что в этих материалах рассматриваются L-выражения — жёсткие выражения без t-переменных. При реализации прогонки в Простом Рефале следует описанные алгоритмы аккуратно расширить на t-переменные.

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions