Re: Refal+ abstract syntax


Subject: Re: Refal+ abstract syntax
From: Arkady Klimov (klimovark@mail.ru)
Date: Sun Dec 05 1999 - 19:09:01 MSK


Андрей, добрый день.

Как я понял, то что ты здесь предлагаешь, это - средство, позволяющее
смешивать результатные выражения с блоками (тоже, видимо,
результатными), чтобы их результаты объединялись в одно значение путем
конкатенации, да? В принципе, это интересная возможность, и о ней
стоит подумать, но, на мой взгляд это никак не связано с вопросами АС,
которые мы обсуждали. Тем не менее давайте обсудим и эту возможность.

1. А какие средства в исходном синтаксите будут ей отвечать?

2. А почему мы ограничиваемся только возможностью конкатенации
выражения с блоком, для полноты счастья было бы неплохо уметь
использовать блок как произвольную часть результатного выражения,
например брать его в скобки, передавать аргументом в функции и т.п.,
например (в условном внешнем синтаксисе):
        <F e1 ({<G e2>:t3 e4=t3})>
Но тогда и в АС нужно иметь возможность просто поместить блок как один
из элементов результатного выражения. В АС это ведь ничему не
противоречит, поскольку там все скобки помечены тегами и все
однозначно разбираемо. С семантикой, думаю, тоже больших проблем не
будет, также как и с компиляцией в виртуальный код. Но, подчеркну еще
раз, это все замечательно в АС, но во внешнем синтаксисе могут быть
синтаксические проблемы. Но лично я не вижу ничего против того, чтобы
уже сейчас это ввести в АС, не обязательно думая о том, как это будет
во внешнем. Хотя бы для тех приложений, где нужно будет порождать
программы в АС динамически.

Аркадий.

PS. Продолжаешь ли ты работать над АС? Мне хотелось бы получить твои
комментарии по сути предложенного мной в
http://inet.keldysh.ru/dpt_16/arklimov/RefalAbstractSyntax.htm

----- Original Message -----
From: Andrey Slepuhin <pooh@msu.ru>
To: Arkady Klimov <klark@bagirra.rinet.ru>
Cc: Sergei M. Abramov <abram@botik.ru>; <refal@botik.ru>
Sent: Friday, November 26, 1999 4:14 PM
Subject: Re: Refal+ abstract syntax

> День добрый!
>
> Насчет "трех источников и трех составных частей":
> похоже, что это 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