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