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