Re: Refal+ abstract syntax


Subject: Re: Refal+ abstract syntax
From: Andrey Slepuhin (pooh@msu.ru)
Date: Fri Nov 26 1999 - 16:14:36 MSK


День добрый!

Насчет "трех источников и трех составных частей":
похоже, что это t.Pattern, t.Format и t.Result :-)

Семантику, на мой взгляд, нужно понимать так:

1) t.Pattern сравнивает текущее значение результата с образцом,
изменяя при этом значения переменных. Текущее значение результата
при этом не изменяется (в Рефале+ оно сейчас обнуляется).
Т.е. если R - результатное выражение, то запись вида
  R : e1, R : e2
можно представить как

t.Result t.Pattern t.Pattern
   R e1 e2

2) t.Format запихивает текущее значение результата в жесткий образец,
изменяя при этом значения переменных. Текущее значение результата
при этом не изменяется (в Рефале+ оно сейчас обнуляется).
Т.е. если R - результатное выражение, то запись вида
  R :: e1, R :: e2
можно представить как

t.Result t.Format t.Format
   R e1 e2

3) С t.Result дело обстоит чуть-чуть сложнее. Рассмотрим
последовательность
t.Result t.Block
Вопрос: будет ли вычисление t.Block заменять значение результата
или конкатенироваться с уже существующим? Хотелось бы иметь и то
и другое. Предложение: ввести тег "Flush", который будет сбрасывать
текущее значение результата. Тогда t.Result и t.Block будут
всегда конкатенироваться с текущим результатом.

То есть, в гипотетическом Рефале-X (с точки зрения существующих
рефалов приведенный ниже код некорректный, хотя интуитивно понятный)

'a' {'b';} -> t.Result t.Block
                       'a' {'b';}
  
'a', {'b';} -> t.Result "Flush" t.Block
                       'a' {'b';}

Таким образом любая запятая будет переходить во "Flush"
(за исключением возможных оптимизаций - см. ниже)
Сейчас в Рефале+ перед запятой выходной формат должен быть
пустым, т.е. если перед запятой стоит результатное выражение R
с непустым выходным форматом, то надо писать, скажем, R::e,
что, в общем-то не очень эстетично.
Замечание. Выражение вида R : e1, R : e2 дословно преобразуется в

t.Result t.Pattern "Flush" t.Result t.Pattern
    R e1 R e2

хотя может быть соптимизировано до

t.Result t.Pattern t.Pattern
    R e1 e2

Далее. "Not" все-таки относится к e.Statement и запись должна быть
"Not" (e.Statement)
Тогда
"Not" ("Not" (e.Statement))
имеет вполне понятную семантику.

В целом, конечно, синтаксис получается шире, чем позволяют существующие
рефалы.
В выходные попробую еще подумать (в частности мне все-таки не нравятся
метки), а пока переключаюсь на текущие дела.

Всего доброго,
Андрей.



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:58 MSD