[draft] N2 – добавил примеры типизации и диаграмму
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.12 01:48
Оценка: 54 (4)
Представляю на суд общественности первые наброски описания Н2
Автор(ы): Чистяков Владислав Юрьевич
Дата: 17.05.2012
В данной статье рассказывается о новом проекте языкового фрэймворка – N2
.

Добавил примеры типизации и диаграмму.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [draft] N2 – языковый фрeймворк - добавил примеров
От: Ziaw Россия  
Дата: 28.03.12 04:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Представляю на суд общественности первые наброски описания Н2
Автор(ы): Чистяков Владислав Юрьевич
Дата: 17.05.2012
В данной статье рассказывается о новом проекте языкового фрэймворка – N2
.


VD>Добавлены раздел Синтаксический модуль
Автор(ы): Чистяков Владислав Юрьевич
Дата: 17.05.2012
В данной статье рассказывается о новом проекте языкового фрэймворка – N2


Чтобы использовать syntax module его надо модифицировать или это опечатка? Если не опечатка, это очень печальное требование, нарушающее принцип open/closed из SOLID.

syntax module Expression
{
  using ExpressionPlusesExtention; // импорт расширяющих правил
  ... // все как в примере приведенном выше
}

syntax module ExpressionPlusesExtention
{
  using cp = Expression; // псевдоним для синтаксического модуля CalcParser

  Plus       is cp.Expr = '+'  expr @ Unary
  PrefixInc  is cp.Expr = "++" expr @ Unary;
  PostfixInc is cp.Expr = expr @ Primary "++";
}



Вот по этому коду:
Number = digits s
  {
    where digits : Digits;
    Value : decimal = decimal.Parse(GetText(digits));
  }


Синтаксис выглядит не очень логично. В большинстве языков декларативные констрейнты отделяются от кода, может быть сделать как-то так?

Number = digits s
  where digits : Digits // например так, where придется сделать зарезервированным в грамматике словом, как using
  {
    Value : decimal = decimal.Parse(GetText(digits));
  }


Или так:

Number = $(digits : Digits) s
  {
    Value : decimal = decimal.Parse(GetText(digits));
  }


Ну и совсем мелочь, стоит ли тащить из первой версии названия типов вроде NToken? Читая такой тип я предполагаю, что есть менее специализированный Token, а этот отличается тем, что он N. Что значит N догадки возникают, но уверенности в них никакой. Про всякие assert2, ImpicitCTX, я думаю даже говорить не надо.
Re[2]: [draft] N2 – языковый фрeймворк - добавил примеров
От: WolfHound  
Дата: 28.03.12 11:07
Оценка: +1
Здравствуйте, Ziaw, Вы писали:

Z>Чтобы использовать syntax module его надо модифицировать или это опечатка? Если не опечатка, это очень печальное требование, нарушающее принцип open/closed из SOLID.

Это просто возможность разбить один модуль на два.
Не более того.
Выше же написано что можно и без взаимных ссылок работать.

Z>Синтаксис выглядит не очень логично. В большинстве языков декларативные констрейнты отделяются от кода, может быть сделать как-то так?

Над синтаксисом еще работать и работать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [draft] N2 – языковый фрeймворк - добавил примеров
От: WolfHound  
Дата: 28.03.12 11:07
Оценка:
Здравствуйте, VladD2, Вы писали:

s : void = ' '*;
Не является лексерным правилом. И не может быть использовано внутри лексерных правил.
Также не забудь написать про то что лексерные правила не поддерживают рекурсию.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.12 13:49
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, VladD2, Вы писали:


WH>s : void = ' '*;

WH>Не является лексерным правилом.

Спорный вопрос, ну да будь по твоему. Поправил.

WH>И не может быть использовано внутри лексерных правил.


ОК, исправил.

WH>Также не забудь написать про то что лексерные правила не поддерживают рекурсию.


Это написано ниже.

• Лексические – разбирающие лексемы (token-ы, последовательности символов считающеюся минимальными единицами языка). Перед лексическим правилом ставится ключевое слово «token». Такие правила могут использовать только регулярные грамматики, так как в итоге они преобразуются в детерминированный конечный автомат (ДКА). В лексических правилах разрещается использовать оператор «альтернатива» – «|». Как и в БНФ или регулярных выражениях этот оператор не задает приоритет правил, так что порядок правил в нем не влияет на разбор. В лексических правилах недопустимо использование расширяемых правил или ссылаться на синтаксические правила.

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [draft] N2 – языковый фрeймворк - добавил примеров
От: WolfHound  
Дата: 28.03.12 15:11
Оценка:
Здравствуйте, VladD2, Вы писали:

WH>>Также не забудь написать про то что лексерные правила не поддерживают рекурсию.

VD>Это написано ниже.
В каком месте?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.12 16:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>>>Также не забудь написать про то что лексерные правила не поддерживают рекурсию.

VD>>Это написано ниже.
WH>В каком месте?

В браузере нет поиска?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [draft] N2 – языковый фрeймворк - добавил примеров
От: WolfHound  
Дата: 28.03.12 17:12
Оценка:
Здравствуйте, VladD2, Вы писали:

WH>>В каком месте?

VD>В браузере нет поиска?
Где в твоей цитате слово рекурсия?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.12 18:10
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>>>В каком месте?

VD>>В браузере нет поиска?
WH>Где в твоей цитате слово рекурсия?

Думаешь фразу "могут использовать только регулярные грамматики" не поймут?

Или рекурсия к себе же тоже запрещена?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.12 19:51
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Представляю на суд общественности первые наброски описания Н2
Автор(ы): Чистяков Владислав Юрьевич
Дата: 17.05.2012
В данной статье рассказывается о новом проекте языкового фрэймворка – N2
.


VD>Добавлены раздел Синтаксический модуль
Автор(ы): Чистяков Владислав Юрьевич
Дата: 17.05.2012
В данной статье рассказывается о новом проекте языкового фрэймворка – N2


Народ! Не стесняйтесь критиковать!

Обратная связь — это то что сделает документ понятным.

Я вот не могу понять. То ли всем все понятно (что подозрительно), то ли все настолько непонятно, что все боятся задавать вопросы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [draft] N2 – языковый фрeймворк - добавил примеров
От: _Claus_  
Дата: 28.03.12 20:17
Оценка:
VD>Я вот не могу понять. То ли всем все понятно (что подозрительно), то ли все настолько непонятно, что все боятся задавать вопросы.

using внутри макроса режет глаз. есть же механизм алиасов, если шо, зачем оно, если можно как обычно.и компилятору легче.
Re[3]: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.12 20:59
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>using внутри макроса режет глаз. есть же механизм алиасов, если шо, зачем оно, если можно как обычно.и компилятору легче.


Что-то я совсем не понял сказанного. Что не так с "using"?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [draft] N2 – языковый фрeймворк - добавил примеров
От: WolfHound  
Дата: 28.03.12 21:01
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Думаешь фразу "могут использовать только регулярные грамматики" не поймут?

Вот ты не понял.

VD>Или рекурсия к себе же тоже запрещена?

Конечно.
Есть, конечно, частные случаи рекурсии, которые можно поддержать. Но проще запретить. Ибо смысла в них все равно нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.12 21:14
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Синтаксис выглядит не очень...


Кокретные детали синтаксиса еще будут не раз пересматриваться. Так что это последнее что надо обсуждать в данный момент.

Мне больше интересует понятность закладываемых идей и наличие логических ошибок в описании или дизайне.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [draft] N2 – языковый фрeймворк - добавил примеров
От: _Claus_  
Дата: 28.03.12 21:48
Оценка:
VD>Что-то я совсем не понял сказанного. Что не так с "using"?

По моему — логичней было бы сохранить для using обычный смысл. открытия namespace вверху. описания будет меньше. и привычней.

например

using standartNPrimirive;
using standartNCycle;
//дальше описываем новые циклы

syntax module for1
..


syntax module for2
..

syntax module foreach1
..


в предлагаемом в документе варианте, насколько я понимаю, эти верхние 2 строки будут дублироваться внутри каждого описываемого цикла.
что видится нерациональным при здравой компоновке. если же глобальная доступность предусмотрена также (как описал выше), то можно
и оставить. кушать оно не просит.
Re[5]: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.03.12 01:32
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>По моему — логичней было бы сохранить для using обычный смысл. открытия namespace вверху. описания будет меньше. и привычней.


Обычный смысл сохранится. Просто мы используем эту же конструкцию для импорта одной грамматики в другую. Вводить для этого новый синтаксис считаю излишним.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [draft] N2 – языковый фрeймворк - добавил примеров
От: Аноним  
Дата: 30.03.12 04:09
Оценка:
Здравствуйте, VladD2, Вы писали:

Все такие просьба добавить возможность в одном модуле определять и синтаксис и его использование.
Для начинающих так на много удобнее.
Re: [draft] N2 – языковый фрeймворк - добавил примеров
От: Аноним  
Дата: 30.03.12 05:03
Оценка:
Здравствуйте, VladD2, Вы писали:

разрешил бы писать так
syntax module Literal
{
  token Digit    = ['0'..'9'];
  token Digits   = Digit+ ('.' Digit+)?;

  s : void = ' '*;

  Number = digits:Digits s
  {
   // where digits : Digits;
    Value : decimal = decimal.Parse(GetText(digits)); //круто
  }
}


спецшаблон s мне не нравиться, если возможно то лучше вынести его в макросы синтаксиса.

как я понимаю если в одном модуле определен порядок данной операции то в другом он не может быть определен или может быть переопределен или быдет выбираться произвольным порядком?
Как быть если порядок определен разным в разных независимых библиотеках(например для разных типов)?

«scope» — октрывает новую область видимости. Области видимости используются для управлению сервисами компилятора, такими как «связывание имен» или «динамическое расширение грамматики».

Для унификации я все таки добавил бы не = ,а например ===, может и многословно и длинно, зато четко выделено, где унификация(или у вас ограниченная унификация???), а где присвоение. В принципе унификацией в языке можно заменить == и = и match. B вообще внести надо в сам Н2.

И вообще стоило бы сделать объявление def a=1; так как сделано в Go a:=1; если := то определение переменной если = то присвоение.

На счет ConstValue. Сделано крайне муторно, но сам факт что не забыли уже плюс.

Add is Expr = Expr1 '+' Expr2
{
  Precedence = Additive;
  ConstValue = ConstValue.TrySumLiterals(Expr1.ConstValue, Expr2.ConstValue);
}

как вяжется это текст с
  Add        is Expr = expr1 '+' expr2 { Precedence = Additive; }

не понятно.
ConstValue = ConstValue.TrySumLiterals(Expr1.ConstValue, Expr2.ConstValue);
будет всегда работать даже если не совпадают типы?

N2 поддерживает области видимости (scopes). Области видимости нужны для организации разного рода контекстных сервисов и действий. В частности области видимости нужны для работы сервиса разрешения имен (таблицы символов), или, например, для динамической загрузки синтаксических расширений.
Это о чем????
Re[2]: [draft] N2 – языковый фрeймворк - добавил примеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.03.12 05:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>разрешил бы писать так...

А>
А>  Number = digits:Digits s
А>


Можно и так. Об этом подробно написано ниже где отписывается синтаксис.

А>спецшаблон s мне не нравиться, если возможно то лучше вынести его в макросы синтаксиса.


"Шаблоны"... "макросы" в данном контексте вещи не определенные. Правило s и S — предопределены, так как без них вообще невозможно обойтись, но их описание можно заменить.

А>как я понимаю если в одном модуле определен порядок данной операции то в другом он не может быть определен или может быть переопределен или быдет выбираться произвольным порядком?

А>Как быть если порядок определен разным в разных независимых библиотеках(например для разных типов)?

Вообще не понял о чем идет речь. Что понимается под операций и что понимается под порядком?

А>«scope» — октрывает новую область видимости. Области видимости используются для управлению сервисами компилятора, такими как «связывание имен» или «динамическое расширение грамматики».


Опять не понял. Не ясен смысл слова "открывает"?

А>Для унификации я все таки добавил бы не = ,а например ===, может и многословно и длинно, зато четко выделено, где унификация(или у вас ограниченная унификация???), а где присвоение. В принципе унификацией в языке можно заменить == и = и match. B вообще внести надо в сам Н2.


Что понимается под унификацией? Унификация, как таковая, будет применяться только в констрэйнах на типы (для описания вывода типов). Если речь о дополнительных полях, то там речь идет не об унификации, а об более простом понятии эквивалнтности. От унификации оно будет отличаться тем, что не поддерживает паттерн-матчинг. Поля предназначены для передачи значений. Но нам нужно сделать эту передачу нелинейной (в разные стороны) и безопасной. Причем все это в условиях когда правила компилируются независимо.

А>И вообще стоило бы сделать объявление def a=1; так как сделано в Go a:=1; если := то определение переменной если = то присвоение.


Это к делу не относится вообще. Базовый язык Немерл. И менять его пока никто не собирается.

А>На счет ConstValue.


Что кажется мутным?

А>Сделано крайне муторно, но сам факт что не забыли уже плюс.




А>
А>Add is Expr = Expr1 '+' Expr2
А>{
А>  Precedence = Additive;
А>  ConstValue = ConstValue.TrySumLiterals(Expr1.ConstValue, Expr2.ConstValue);
А>}
А>

А>как вяжется это текст с
А>
А>  Add        is Expr = expr1 '+' expr2 { Precedence = Additive; }
А>

А>не понятно.

Два примера. Во втором добавлено дополнительное поле для демонстрации его использования. В прочем, рассматривать пример в связке особого смысла нет.

А>
А>ConstValue = ConstValue.TrySumLiterals(Expr1.ConstValue, Expr2.ConstValue);
А>
будет всегда работать даже если не совпадают типы?


Ох, опять приходится телепатировать. Типы Expr1.ConstValue?
Будет. Смотри реализацию функции TrySumLiterals. Она проверяет реальные типы и в случае их несовпадения возвращает ConstValue.Nine(). Тут уже нужно быть знакомым с алгебраическими типами, чтобы понять суть происходящего.

А>N2 поддерживает области видимости (scopes). Области видимости нужны для организации разного рода контекстных сервисов и действий. В частности области видимости нужны для работы сервиса разрешения имен (таблицы символов), или, например, для динамической загрузки синтаксических расширений.

А>Это о чем????

Об областях видимости, ваш КО

Можно задавать вопросы более конкретно? Если что-то не понятно, то просьба объяснять причины непонимания или объяснять как это понял ты. А то я просто не знаю что отвечать, а мой телепатический цент на грани сбоя.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [draft] N2 – языковый фрeймворк - добавил примеров
От: Аноним  
Дата: 30.03.12 06:29
Оценка:
Здравствуйте, VladD2, Вы писали:

А>>как я понимаю если в одном модуле определен порядок данной операции то в другом он не может быть определен или может быть переопределен или быдет выбираться произвольным порядком?

А>>Как быть если порядок определен разным в разных независимых библиотеках(например для разных типов)?

VD>Вообще не понял о чем идет речь. Что понимается под операций и что понимается под порядком?


В одной библиотеке Петя добавил exp ^^ exp
В другой библиотеке Костя добавил exp ^^ exp
и как это будет все работать?

А>>«scope» — октрывает новую область видимости. Области видимости используются для управлению сервисами компилятора, такими как «связывание имен» или «динамическое расширение грамматики».

VD>Опять не понял. Не ясен смысл слова "открывает"?
У тебя орфографическая ошибка в статье. Я ее подчеркнул.

А>>Для унификации я все таки добавил бы не = ,а например ===, может и многословно и длинно, зато четко выделено, где унификация(или у вас ограниченная унификация???), а где присвоение. В принципе унификацией в языке можно заменить == и = и match. B вообще внести надо в сам Н2.


VD>Что понимается под унификацией? Унификация, как таковая, будет применяться только в констрэйнах на типы (для описания вывода типов). Если речь о дополнительных полях, то там речь идет не об унификации, а об более простом понятии эквивалнтности. От унификации оно будет отличаться тем, что не поддерживает паттерн-матчинг. Поля предназначены для передачи значений. Но нам нужно сделать эту передачу нелинейной (в разные стороны) и безопасной. Причем все это в условиях когда правила компилируются независимо.


Не понятно тогда почему не сделать унификацию полностью? Что мешает? Чему мешает?

VD>Ох, опять приходится телепатировать. Типы Expr1.ConstValue?

VD>Будет. Смотри реализацию функции TrySumLiterals. Она проверяет реальные типы и в случае их несовпадения возвращает ConstValue.Nine(). Тут уже нужно быть знакомым с алгебраическими типами, чтобы понять суть происходящего.
Извиняюсь, там я не заметил
abstract Expr
{
  ConstValue : ConstValue;
}
Вообще слово abstract сбивает с толку но это дело привычки

VD>Об областях видимости, ваш КО

Не понятно зачем они тут нужны и как и когда их использовать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.