Re: Refal+ abstract syntax


Subject: Re: Refal+ abstract syntax
From: Sergei M. Abramov (abram@botik.ru)
Date: Fri Nov 26 1999 - 11:39:24 MSK


День добрый, всем!

> 2. Путь последовательность операторов вытянут по-
> горизонтали через конкатенацию, а не через cons .

Не говоря "ЗА" или "ПРОТИВ" просто подчеркну разницу: разница такая же, как
между

   (x+y)*(z+w) и (* + z w + x y)

С этой точки зрения с репликой:

From: Andrey Slepuhin <pooh@msu.ru>
>2) Предлагаемый синтаксис несколько ближе к виртуальному коду. По
> крайней мере конструкций типа "Label s" в абстрактном синтаксисе
> иметь не хотелось бы.

я согласен.

> 3. Все скобки, включая образующие термы, имеют впереди теги.
>
> 4. Я не стал здесь брать теги в кавычки.

Вообще говоря--"Form" и Form--эквивалентны

    (* Сегодня и в Рефала+ я надеюсь они уже эквивалентны? Или еще нет?
       Ну, по крайней мере, в длиннющей дискуссии про "кавычки" и
       "крики души"--около 80 писем с 30/08/1999 по 10/09/1999,--было
       это устаканено и ЭТО НАДО ДЕЛАТЬ В Рефале+.
     *)

Однако (дело вкуса!!!) мне кажется, что чисто визуально в двух эквивалентных
текстах:

>t.ProgramFile ::= (Program t.Source t.Import e.Program)
>
>t.Import ::= (Use e.Names)
>
>t.Source ::= (Source s.FileName)

и

>t.ProgramFile ::= ("Program" t.Source t.Import e.Program)
>
>t.Import ::= ("Use" e.Names)
>
>t.Source ::= ("Source" s.FileName)

выигрывает по читабельности второй--лучше (контрастнее) отличаются нетерминалы и
терминалы...
Еще раз--это дело вкуса.

(* ------------------------------------------------------------
Для справки и обмена Рефал+ опытом: а я в своих разработках делаю еще и так:

>t.ProgramFile ::= (&Program t.Source t.Import e.Program)
>
>t.Import ::= (&Use e.Names)
>
>t.Source ::= (&Source s.FileName)

Обычно я завожу Рефал+ модуль tаgs.rfi:

$const Program = "Program", Use = "Use", Source="Source";

(замечу, что tаgs.rf при этом ПУСТОЙ, интересно, правда?) Во время отладки
важно, чтобы теги печатались читабельно--поэтому тег==слово (звено+рюкзак для
хранения тела слова...). При этом (в сегодняшнем рефале+) сравнение слов не
сводится к сравнению только звеньев--делается еще сравнение рюкзаков... А после
отладки я имею возможность переопределить:

$const Program = 1, Use = 2, Source=3;

что экономит память (тег==звено) и время сравнения тэгов (сравниваются только
звенья)...

------------------------------------------------------------ *)

> 5. Сложные конструкции (перестройки, присваивания) разбиты на
> составляющие действия.
>
> 6. Семантика действия состоит в пополнении среды и выработке
> нового форматного значения (объектного выражения со
> статическим форматом). Действия бывают простые (образцы,
> результаты, форматы) и сложные (блоки).
>
> 7. Есть отдельный оператор NoFail, непроницаемый для $Fail, и
> CUTALL, выражающий семантику равенства рефала +.
> Непрозрачный блок выражается так: NoFail
> (Block e.Branches).
>
> 8. $iter может быть разложен в более элементарные понятия
> (Label sl) и (Loop sl) см.ниже. В операторе Loop метка
> sl должна быть определенной (оператором Label) выше на
> пути от начала функции к данному оператору Loop.
> Ищется ближайшая точка Label с тем же символом-меткой.
>
> 9. Вместо трех понятий: Tail, Path, Source одно: e.Sentence.

Пункты 5, 6, 7, 8 связаны все (являются следствием) с п. 2. См. замечание на п.2
(и реплику <pooh@msu.ru>).

> 10. Констант нет: они уже подставлены.

Вот! Я же говорил, что это требует дискуссии!

Важное завоевание рефала+ (как и рефала-6) -- введение понятий "разделяемое
данное". Конструкции "$const X = ... " и "&X" позволяют выражать эти понятия на
уровне констант. Пример:

$const X = '1234567890',
       X1 = (&X) (&X),
       X2 = (&X1) (&X1),
       X3 = (&X2) (&X2),
       .....
       X64 = (&X65) (&X65);

F = &X64;

Ну а теперь к экспертам--расскажите:

    -1- Как это выглядит сегодня в реализации Рефала+? Около 138 звеньев в
сегменте данных, не правда ли?;

    -2- И как это будет выглядить в абстрактном синтаксисе, если принять
концепцию "Констант нет: они уже подставлены"?

    -3- Отдельное пожелание: хотелось бы, чтобы кто-нибудь выписал и прислал на
список рассылки файл с сегодняшним абстрактным синтаксисом функции F в условии
"Констант нет: они уже подставлены" ;-)

(* только мне не присылайте--у меня маленький диск--по моим оценкам будет:
   10*2^64 байт == 160 миллионов Террабайт текста ;-)
 *)

> Но вопрос: что такое
> имя функции? И как выглядит внутри выражения ссылка на
> функцию? Другие символы ссылки? Возможный ответ: как (Ref
> s.Word). Определяющие вхождения задаются просто как s.Word. В
> вызове функции используется (Ref s.Word)

Да! И это важное место для существенной дискуссии...

> 11. Определения символов-ссылок должна быть возможность
> расширять список типов ссылок.

Да! И это важное место для существенной дискуссии...

> 12. Объектные символы (в отличие от символов-ссылок)
> представляются сами собой, а не как (Symbol s)

Это можно сделать если ВСЕ рефальские круглые скобки будут представлены с тэгом
("Par" ....). Это сделано в определении "t.HardTerm", но пропущено (я не
ошибаюсь-ли?) в

>t.PatternTerm ::= t.Symbol
> | (e.PatternExpression)
                          ^ Par?
> | t.Variable

Ок...

> 13. Операторы Error и Trap имеют неявный дополнительный
> аргумент продолжение справа от оператора.

Это опять про п.2.

> 14. Остаток после операторов Fail и Loop игнорируется.

Это опять про п.2.

> 15. Конкретная реализация может не поддерживать какие-то
> элементы (или сочетания элементов) абстрактного синтаксиса. В
> этом случае должно выдаваться внятное сообщение.

Да.

>======================================================================
>
>t.ProgramFile ::= (Program t.Source t.Import e.Program)
>
>t.Import ::= (Use e.Names)
>
>t.Source ::= (Source s.FileName)

Алик!
    (1) Хотелось бы каких-то пояснений...
    (2) Модульность требует существенных дискуссий
    (3) Вижу "импорт", не вижу "экспорта"...

>e.Program ::= t.ProgramItem
> | e.Program t.ProgramItem
> | t.Line

    (1) кажется тело программы может быть пустым;
    (2) не понял, что значит, что значит, что тело состоит только из t.Line?
Может быть имелось в виду, что есть алтернатива у "t.ProgramItem :== ..... |
t.Line" ?

>t.ProgramItem ::= t.FuncDef | t.ObjectDef | t.Initializer

    (1) Да, симпатично, понравился t.Initializer ;-) А зачем он?
    (2) Следует добавить альтернативу | t.Pragma

Я бы сделал так:

-а- в текущем тексте Алика заменил бы глобально t.Line --> t.Pragma, а вместо

>t.Line ::= (Line s.LineNumber s.PosNumber)
> | (Line s.LineNumber)

-б- и написал бы:

t.Pragma ::= (Pragma e.Pragma)

e.Pragma ::= t.Line
                       | "Traseall"
                       | "Trase" e.Fnames
                       ......
                       | e.OtherPragma

t.Line ::= (Line s.LineNumber s.PosNumber)
                      | (Line s.LineNumber)

Ну, кажется и все (пока--при первом просмотре) замечания...

Удачи!

Сергей



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