Антон!

«Кое-что было реализовано потом в Рефале+ и описано даже:
http://pat.keldysh.ru/~orlov/publications/2004.05-AbramovOrlov-Kompiljacija_sintaksicheskogo_otozhdestvlenija_jazyka_Refal.pdf
 »

Прочитал. Любопытно. Если я правильно понял, то для образца

(e.Key) e.Items-B (e.Key t.Value) e.Items-E

или, если записать его в виде набора перестроек:

(e.Key) e.Items
  , e.Items : e.Items-B (e.Item) e.Items-E
  , e.Item : e.Key t.Value

будет построен код, учитывающий, что переменная e.Items-B будет удлиняться от 0 
до |e.Items|−1 (а не до |e.Items|), и что |e.Item| = |e.Key|+1.

Для случая

(e.Prefix) e.Strings-B (e.Prefix e.Suffix) e.Strings-E

или

(e.Prefix) e.Strings
  , e.Strings : e.Strings-B (e.String) e.Strings-E
  , e.String : e.Prefix e.Suffix

будет учитываться ещё и |e.String| >= |e.Prefix|.

А для

(e.Substr) e.Begin e.Substr e.End

эквивалентного

(e.Substr) e.Text, e.Text : e.Begin e.Substr e.End

переменная e.Begin будет удлиняться от 0 до |e.Text|−|e.Substr|.

Т.е. экономия получается в том, что на циклах удлинения можно сэкономить от 
одного до нескольких итераций, а также сравнивать длины переменных до сравнения 
контента.

Для некоторых проверок выше можно придумать маленькие алгоритмы ad 
hoc-оптимизации (например, для e.Item : e.Key t.Value или e.String : e.Prefix 
e.Suffix) — обнаруживать их и вставлять проверки, но лучше, наверное, более 
системный и общий алгоритм.

Ещё алгоритм по ссылке может даже оптимизировать (проверяя сначала делимость 
длины аргумента на 3):

IsTriplet {
  e.1 e.1 e.1 = True;
  e.X = False;
}

Но это, всё-таки, искусственный пример, призванный продемонстрировать 
возможности алгоритма. Примеры образцов выше всё-таки ближе к практике.

С уважением,
Александр

 

From: Александр Коновалов [mailto:a.v.konovalo...@mail.ru] 
Sent: Monday, February 5, 2018 9:51 PM
To: refal@botik.ru
Subject: RE: Не понял про ограниченный РЕФАЛ

 

Спасибо, Антон! Буду изучать.

Александр Коновалов

 

From: Anton Orlov [ <mailto:orlo...@gmail.com> mailto:orlo...@gmail.com] 
Sent: Monday, February 5, 2018 9:24 PM
To:  <mailto:refal@botik.ru> refal@botik.ru
Subject: Re: Не понял про ограниченный РЕФАЛ

 

 

 

2018-02-05 21:00 GMT+03:00 < <mailto:sergei.romane...@supercompilers.ru> 
sergei.romane...@supercompilers.ru>:

2018-02-05 20:32 GMT+03:00 Александр Коновалов <a.v.konovalo...@mail.ru 
<mailto:a.v.konovalo...@mail.ru> >:

Мне кажется, Вы о какой-то другой работе говорите. По ссылке рассматривается 
сопоставление
типового выражения общего вида с L-выражением, которое, в отличие от 
турчинского, может
содержать неодноимённые t-переменные и v-переменные. Ну и плюс рестрикции.


А ведь и правда! Там смысл работы состоял в том, чтобы вычислить не только 
*пересечение* множеств, но и их *разность*.

Но были и другие изыскания, по поводу сопоставлений вроде (eX) (eX) : (A e1) 
(e1 A), сводящихся к решению уравнений вроде A e1 = e1 A. Но они так в 
рукописях и остались. Наверное, решили, что "народу это не надо".

 

Кое-что было реализовано потом в Рефале+ и описано даже:

http://pat.keldysh.ru/~orlov/publications/2004.05-AbramovOrlov-Kompiljacija_sintaksicheskogo_otozhdestvlenija_jazyka_Refal.pdf

 

Антон

 

Ответить