Re[27]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: WolfHound  
Дата: 05.01.13 11:13
Оценка: -1
Здравствуйте, AlexRK, Вы писали:

ARK>Интерфейс библиотеки это только семантика.

А синтаксис задан языком, в котором эта библиотека используется.
И ты даже если очень захочешь, не сможешь его изменить.

ARK>И она не содержит никаких завязок, на то как эта библиотека будет реализована.

Это не правда.
1)Она завязаны на вычислительную модель языка.
2)Мы не можем превратить цепочку вызовов LINQ to Objects в кучу циклов.
При этом если мы работаем на языке, который напрямую поддерживает работу с коллекциями, то мы можем генерировать любой код.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[33]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: WolfHound  
Дата: 05.01.13 11:24
Оценка: -1
Здравствуйте, Mamut, Вы писали:

WH>>>>Нет. Я делаю вывод о том, что без ДСЛ у тебя было бы не 5К строк прикладной логики, а 50К.

M>>>Неверный вывод.
WH>>Почему?
M>А подумать?
Гадать, что творится у тебя в голове мне не интересно.
Особенно учитывая то, что ты читаешь не то, что написано.

M>Если код с использованием библиотеки выглядит как addRule(a,b,c), а код на DSL как rule a b c, то править одинаково.

Откуда тогда получается разница в 10 раз?
Хватит юлить.

M>Из этого так же никак не следует, что его будет написано 50к строк такого кода.

Именно что следует.
Не зря же ДСЛ сделали.

M>Эта фраза принадлежит тебе, и доказательств этой фразы вот уже который год ждем не дождемся.

В твоей ссылке написано, что генерируется в 10 раз больше кода, чем было на ДСЛ.

M>Ниже я устал, и местами спускаюсь на уровень твоей аргументации, ты уж извини.

У тебя аргументации вообще нет.
Всё на что ты способен это приписать мне то, что я не говорил и с этим спорить.

M>А, да. Единственный DSL, из «десятков каждый день», который ты способен предоставить.

Опять выдумал что-то и с этим споришь.

M>>>И то, что можно изменять библиотеки, не изменяя интерфейса библиотеки или не выкидывая весь код, — это тоже ложь. Естественно, ибо also sprach Wolfhound ©™.

WH>>Если тебя послушать то получается, что библиотеки это всё могут, а ДСЛ нет? Я тебя правильно понял?
M>Нет, неправильно
Ну, тогда расшифруй, что ты имеешь в виду.
Ибо разговор идет о том, что нужно ломать интерфейс.
А значит переделывать весь прикладной код.
А значит ни о каком черном ящике речи уже нет.

WH>>При этом объективно ДСЛ это могут лучше.

M>О да, объективно. Объективные вещи имеют в основе аргументацию лучше, чем «лож», «неправда», и «у меня на компьютере работают».
Я несколько раз объяснял почему.
Но ты тупо игнорируешь.

WH>>Просто по тому, что они не содержат никаких завязок на реализацию. А в тех случаях когда не получается прикладного кода на порядок другой меньше и исправить его на порядок другой проще.

M>DSL перестал быть прикладным кодом? Это в какой момент?
Ты вообще читаешь что написано?
Где в этой фразе написано выделенное?
У меня фантазии не хватает, как ты из моих слов сделал этот вывод.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[14]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.13 11:28
Оценка: +1
Здравствуйте, _DAle_, Вы писали:

_DA>DSL нам позволил отобразить все наши концепции напрямую в более-менее лаконичные синтаксические конструкции


Так можно же привести пример конструкции, которая более лаконична, чем код на джаве, нет? У меня вот, даже если не вникать в специфику, страница кода на DSL раскрывается в существенно большее количество кода на целевом языке или в набор команд какого нибудь интерпретатора. Свой такой пример я, вроде бы, уже здесь приводил:
DSL
USING Mock;

SELECT
  bc2.BoolAttr AS ba,
  bc2.BizClass1Link.IntAttr AS ia,
  sq.Identity.BoolAttr,
  jbc2l.BizClass1Link.IntAttr AS lia,
  jbc2r.BizClass1Link.IntAttr AS ria,
  sq.Identity.BizClass1Link.IntAttr AS tjia
FROM
  BizClass2 bc2,
  (SELECT Identity FROM BizClass2) AS sq,
  BizClass2 AS jbc2l JOIN BizClass2 AS jbc2r ON jbc2l.BizClass1Link = jbc2r.BizClass1Link;

Результирующий SQL (в данном случае для игрушечного SQL сервера, но отличие от реальных незначительное)
SELECT 
 [bc2].BoolAttr AS ba,
 [__join_0].IntAttr AS ia,
 [__join_1].BoolAttr AS BoolAttr,
 [__join_2].IntAttr AS lia,
 [__join_3].IntAttr AS ria,
 [__join_4].IntAttr AS tjia
FROM
 [MockSchema].[Tbl-Mock.BizClass2] AS [bc2]
  /*implicit*/LEFT OUTER JOIN [MockSchema].[Tbl-Mock.BizClass1] AS [__join_0] ON (([__join_0].id = [bc2].LinkTo_BizClass1Link_id) AND ([__join_0].tid = [bc2].LinkTo_BizClass1Link_tid)),
 (
  SELECT 
   [MockSchema].[Tbl-Mock.BizClass2].id AS Identity,
   [MockSchema].[Tbl-Mock.BizClass2].tid AS Identity_Type
  FROM
   [MockSchema].[Tbl-Mock.BizClass2]
 ) AS [sq]
  /*implicit*/LEFT OUTER JOIN [MockSchema].[Tbl-Mock.BizClass2] AS [__join_1] ON (([__join_1].id = [sq].Identity) AND ([__join_1].tid = [sq].Identity_Type))
  /*implicit*/LEFT OUTER JOIN [MockSchema].[Tbl-Mock.BizClass1] AS [__join_4] ON (([__join_4].id = [__join_1].LinkTo_BizClass1Link_id) AND ([__join_4].tid = [__join_1].LinkTo_BizClass1Link_tid)),
 [MockSchema].[Tbl-Mock.BizClass2] AS [jbc2l]
  /*implicit*/LEFT OUTER JOIN [MockSchema].[Tbl-Mock.BizClass1] AS [__join_2] ON (([__join_2].id = [jbc2l].LinkTo_BizClass1Link_id) AND ([__join_2].tid = [jbc2l].LinkTo_BizClass1Link_tid))
  INNER JOIN [MockSchema].[Tbl-Mock.BizClass2] AS [jbc2r]
   /*implicit*/LEFT OUTER JOIN [MockSchema].[Tbl-Mock.BizClass1] AS [__join_3] ON (([__join_3].id = [jbc2r].LinkTo_BizClass1Link_id) AND ([__join_3].tid = [jbc2r].LinkTo_BizClass1Link_tid)) ON (([jbc2l].LinkTo_BizClass1Link_id = [jbc2r].LinkTo_BizClass1Link_id) AND ([jbc2l].LinkTo_BizClass1Link_tid = [jbc2r].LinkTo_BizClass1Link_tid))

Бенефит DSL вполне нагляден даже без подробного объяснения специфики и презентаций. И это не боевой пример, это коротенький тест небольшого куска функционала. В реальности разница намного круче, потому что запросы существенно больше и, нередко, сложнее. А в твоем примере что джава, что DSL — примерно одно и тоже.
... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
AVK Blog
Re[25]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: WolfHound  
Дата: 05.01.13 11:36
Оценка: -1
Здравствуйте, Mamut, Вы писали:

WH>>1) Кода на ДСЛ будет на порядок другой меньше.

M>Далеко не факт. Зависит как от библиотеки так и от DSLя
По твоей ссылке ровно на порядок. И это далеко не придел.

WH>>а. Нужно будет переделать меньше клиентского кода.

M>Далеко не факт
Это как? Если у нас кода в 10 раз больше, то и переделывать нужно в 10 раз больше.

WH>>б. Компилятор ДСЛ может давать внятные сообщения с подсказками.

M>Может, но это не обязательно. Более того, компилятор может давать не менее внятные сообщения и для библиотеки
Не может. Всё на что способен компилятор языка общего назначения это сказать, что нет такого метода.

M>Внезапно можно просто сделать рефакторинг для вызовов библиотеки. В частности потому что существующие средства это уже позволяют. Откуда возьмутся средства для простого рефакторинга DSL известно только известным сказочникам.

Лож. Если интерфейс изменился серьезнее чем переименование имени метода, то никаким существующим способом ты ничего не сделаешь.

M>Как там было в примерах? a.Insert(b) против insert b into a? Каким образом реализован этот самый insert вызывающего не волнует от слова вообще. Где там что путается под ногами неизвестно.

В моих примерах такого не было.
У меня примеры немного другие.
http://rsdn.ru/Forum/Message.aspx?mid=4694354&amp;only=1
Автор: WolfHound
Дата: 09.04.12
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: _DAle_ Беларусь  
Дата: 05.01.13 11:38
Оценка: +1
Здравствуйте, AlexRK, Вы писали:

_DA>>Мне вот интересно, а что было понятно из строчки на джаве, если бы я не привел строку на DSL?

ARK>Понятно, что вызывается функция addJProp. Судя по названию — добавление какого-то свойства. Лезем внутрь и смотрим, что там.

То что это "объявление функционала"/"добавление свойства" я и так сказал. Внутри там будет парсинг массива, маппинг каких-то одних объектов на другие, и добавление получившегося в результате объекта в какой-то контейнер. Не думаю, что станет сильно понятней, чем "добавление свойства".

_DA>>Сразу стало понятно, что после строковых констант идет описание выражения в польской нотации? Сразу было понятно, что price — это функционал с двумя параметрами, которому передаются на вход первый и третий параметр создаваемого функционала?


ARK> Чего? "Сразу понятно", угу. Может я тупой, но лично мне вся DSL-строка кажется полностью контр-интуитивной. Чего она делает, я до сих пор не понимаю.


Хм, неужели действительно непонятно? Ок, избавимся от предметной области:
f(x, y, z) = g(x, z) IF h(x, y, z);

Грубо говоря, объявляется новая функция f с тремя параметрами, которая будет равняться функции g(x, z) при условии, что h(x, y, z) не равно null. В ином случае ее значение будет равняться null. Так понятней?
Re[28]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: AlexRK  
Дата: 05.01.13 11:51
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А синтаксис задан языком, в котором эта библиотека используется.

WH>И ты даже если очень захочешь, не сможешь его изменить.

Не совсем, конечно, если речь о дотнете, то либу можно использовать в семействе языков, хотя и очень похожих.
Но в целом верно. Синтаксис задан языком, изменить его нельзя. И это скорее плюс.

WH>1)Она завязаны на вычислительную модель языка.

WH>2)Мы не можем превратить цепочку вызовов LINQ to Objects в кучу циклов.

В принципе очевидно, что вещи, которые можно сделать только на уровне компилятора, на уровне языка недоступны.

Но это ортогонально проблеме "DSL vs. не-DSL". Если желаете делать оптимизации на уровне компилятора, берите модульный компилятор и ковыряйте его как угодно. В том числе "превращайте цепочку вызовов LINQ to Objects в кучу циклов". В чем проблема? Причем тут DSL?
Re[14]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: AlexRK  
Дата: 05.01.13 12:01
Оценка:
Здравствуйте, _DAle_, Вы писали:

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


_DA>>>Мне вот интересно, а что было понятно из строчки на джаве, если бы я не привел строку на DSL?

ARK>>Понятно, что вызывается функция addJProp. Судя по названию — добавление какого-то свойства. Лезем внутрь и смотрим, что там.

_DA>То что это "объявление функционала"/"добавление свойства" я и так сказал. Внутри там будет парсинг массива, маппинг каких-то одних объектов на другие, и добавление получившегося в результате объекта в какой-то контейнер. Не думаю, что станет сильно понятней, чем "добавление свойства".


Алгоритм по крайней мере понятен будет.

_DA>>>Сразу стало понятно, что после строковых констант идет описание выражения в польской нотации? Сразу было понятно, что price — это функционал с двумя параметрами, которому передаются на вход первый и третий параметр создаваемого функционала?


ARK>> Чего? "Сразу понятно", угу. Может я тупой, но лично мне вся DSL-строка кажется полностью контр-интуитивной. Чего она делает, я до сих пор не понимаю.


_DA>Хм, неужели действительно непонятно?


Так точно.

Ок, избавимся от предметной области:
_DA>
_DA>f(x, y, z) = g(x, z) IF h(x, y, z);
_DA>

_DA>Грубо говоря, объявляется новая функция f с тремя параметрами, которая будет равняться функции g(x, z) при условии, что h(x, y, z) не равно null. В ином случае ее значение будет равняться null. Так понятней?

Нда, жесть. Без вашего описания по виду функции я бы не догадался.

Лично мне было бы понятно что-то вроде:

f = function(x, y, z)
{
  return (h(x, y, z) != null) ? g(x, z) : null;
}


или

function f(x, y, z) is
  when h(x, y, z) is not null => g(x, z)
  else null;


ну или еще что-то такое.
Re[29]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: WolfHound  
Дата: 05.01.13 12:16
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Не совсем, конечно, если речь о дотнете, то либу можно использовать в семействе языков, хотя и очень похожих.

ARK>Но в целом верно. Синтаксис задан языком, изменить его нельзя. И это скорее плюс.
Необходимость написать кучу лишнего кода плюс несомненный.

ARK> В принципе очевидно, что вещи, которые можно сделать только на уровне компилятора, на уровне языка недоступны.

Ну, хоть это тебе понятно.

ARK>Но это ортогонально проблеме "DSL vs. не-DSL". Если желаете делать оптимизации на уровне компилятора, берите модульный компилятор и ковыряйте его как угодно. В том числе "превращайте цепочку вызовов LINQ to Objects в кучу циклов". В чем проблема? Причем тут DSL?

Я тебе просто простой пример привел. Чтобы ты понял.
Но обычно семантика кода на ДСЛ не имеет ничего общего с семантикой базового языка.
Максимум что ты можешь сделать, чтобы приблизится к выразительности ДСЛ это сгенерировать вызовами метода код и натравить на него интерпретатор.
Но и в этом случае у тебя просто ДСЛ. Кривой и тормозной ДСЛ.

Еще можно взять, как ты говоришь "модульный компилятор" и с его помощью переписать код так чтобы он делал не то, что он должен делать по правилам языка. Но это будет еще ближе к нормальным ДСЛ. Но очень криво и трудоёмко.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[26]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: Mamut Швеция http://dmitriid.com
Дата: 05.01.13 12:49
Оценка:
WH>>>1) Кода на ДСЛ будет на порядок другой меньше.
M>>Далеко не факт. Зависит как от библиотеки так и от DSLя
WH>По твоей ссылке ровно на порядок. И это далеко не придел.

По моеуй ссылке нигде не говорится, что изначально кода было в 10 раз больше. Это твои бурные фантазии. Например тут же рядом
Автор: _DAle_
Дата: 04.01.13
в примерах DSL, от которого нет никакого явного в 10 раз меньше кода. Но тебе ж наплевать. Ты предпочитаешь видеть только то, что тебе хочется видеть.

WH>>>а. Нужно будет переделать меньше клиентского кода.

M>>Далеко не факт
WH>Это как? Если у нас кода в 10 раз больше, то и переделывать нужно в 10 раз больше.

Осталось доказать утверждение про в 10 раз больше кода, но ведь ты неспособен ни на одно доказательство. Где примеры твоих DSLей, а?

WH>>>б. Компилятор ДСЛ может давать внятные сообщения с подсказками.

M>>Может, но это не обязательно. Более того, компилятор может давать не менее внятные сообщения и для библиотеки
WH>Не может. Всё на что способен компилятор языка общего назначения это сказать, что нет такого метода.

Или неправильный тип. Или неправильное количество аргументов. В общем — достаточно для того, чтобы провести внятный рефакторинг. На что способен компилятор DSLя?

M>>Внезапно можно просто сделать рефакторинг для вызовов библиотеки. В частности потому что существующие средства это уже позволяют. Откуда возьмутся средства для простого рефакторинга DSL известно только известным сказочникам.

WH>Лож. Если интерфейс изменился серьезнее чем переименование имени метода, то никаким существующим способом ты ничего не сделаешь.

О да, а с DSLем никаких проблем, ага-ага. Хватит лапшу на уши вешать.


M>>Как там было в примерах? a.Insert(b) против insert b into a? Каким образом реализован этот самый insert вызывающего не волнует от слова вообще. Где там что путается под ногами неизвестно.

WH>В моих примерах такого не было.
WH>У меня примеры немного другие.
WH>http://rsdn.ru/Forum/Message.aspx?mid=4694354&amp;only=1
Автор: WolfHound
Дата: 09.04.12


И у нас примеры другие
Автор: _DAle_
Дата: 04.01.13
. Но я уже говорил, что опыт других людей для тебя «лож» ©™


dmitriid.comGitHubLinkedIn
Re[27]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: WolfHound  
Дата: 05.01.13 13:20
Оценка:
Здравствуйте, Mamut, Вы писали:

M>По моеуй ссылке нигде не говорится, что изначально кода было в 10 раз больше. Это твои бурные фантазии.

Обычно генерируют код не сильно отличающийся от рукописного.

M>Например тут же рядом
Автор: _DAle_
Дата: 04.01.13
в примерах DSL, от которого нет никакого явного в 10 раз меньше кода. Но тебе ж наплевать. Ты предпочитаешь видеть только то, что тебе хочется видеть.

Ну и что?
Бывают случаи, когда ДСЛ не дает существенного сокращения.
Например, если нужно складывать два Int32, то почти любой язык с этим справится, так что никаким ДСЛ ни буквы не сократить.

M>Осталось доказать утверждение про в 10 раз больше кода, но ведь ты неспособен ни на одно доказательство. Где примеры твоих DSLей, а?

В том сообщении, на которое ты отвечаешь.
Но ты их в упор не видишь.

M>Или неправильный тип. Или неправильное количество аргументов. В общем — достаточно для того, чтобы провести внятный рефакторинг. На что способен компилятор DSLя?

Он способен распознать старый синтаксис.
И сказать, что нужно переделать.
А в сочетании с ИДЕ еще и quick fix сделать.

M>О да, а с DSLем никаких проблем, ага-ага. Хватит лапшу на уши вешать.

См выше.

M>И у нас примеры другие
Автор: _DAle_
Дата: 04.01.13
. Но я уже говорил, что опыт других людей для тебя «лож» ©™

Так я и не о его примерах говорю.
Я говорю про более сложные случаи.
Например, пример из моего поста сейчас генерирует совершенно другой код.
Сделано это было без изменения синтаксиса.
Параллельно Влад в другом бранче менял синтаксис на более человечный.
После чего спокойно смержились. И это при том, что пишем на языке общего назначения. Хотя бутстрапа становится всё больше.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: _DAle_ Беларусь  
Дата: 05.01.13 13:53
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Так можно же привести пример конструкции, которая более лаконична, чем код на джаве, нет?


Ок, я тут нашел в репозитории старый код на джаве и тот вариант, на который его изначально переписали. Конечно, это далеко не одна конструкция, но там кто-то просил большой пример Это практически код некоторого очень простого модуля в системе. На практике преимущество DSL будет куда больше.
DSL:
REQUIRE System, I18n, Currency;

CLASS Сountry 'Страна' : Named, MultiLanguageNamed;

TABLE countryDate(Country, DATE);
TABLE country(Country);

nameOriginCountry 'Наименование (ориг.)' = DATA ISTRING[50] (Country) IN baseGroup; 
sidCountry 'Код страны' = DATA INTEGER (Country) IN baseGroup; 
countrySID 'Страна' (sid) =  GROUP UNIQUE country BY sidCountry(country);

sidOrigin2Country 'Код 2 знака (ориг.)' = DATA STRING[2] (Country) IN baseGroup MINCHARWIDTH 15; 
sidOrigin3Country 'Код 3 знака (ориг.)' = DATA STRING[3] (Country) IN baseGroup MINCHARWIDTH 15; 

currencyCountry 'Валюта' = DATA currency (Country); 
nameCurrencyCountry 'Валюта' (country) = name(currencyCountry(country)) IN baseGroup PREFCHARWIDTH 10;

isDayOffCountryDate 'Выходной' = DATA BOOLEAN (Country, DATE) IN baseGroup; 
defaultCountry 'Страна по умолчанию' = DATA Country (); 
nameDefaultCountry 'Страна по умолчанию' () = name(defaultCountry()) PREFCHARWIDTH 30; 

FORM daysOffForm 'Выходные дни' 
OBJECTS Country 'Страна' INIT PANEL, day=DATE 'День', newDate=DATE 'Дата' FIXED PANEL
PROPERTIES(country) nameOriginCountry, sidCountry, sidOrigin2Country, sidOrigin3Country, nameCurrencyCountry
PROPERTIES OBJVALUE(day), isDayOffCountryDate(country, day), OBJVALUE(newDate), isDayOffCountryDate(country, newDate)
FILTERS isDayOffCountryDate(country, day)
;

NAVIGATOR {
    catalogs {
        ADD daysOffForm;
    }
}


Java:
private ConcreteCustomClass Сountry;
private LP isDayOffCountryDate;
  
public initClasses() {
    Сountry = addConcreteClass("Сountry", "Страна", baseClass.Named, BL.getModule("I18n").getClassByName("MultiLanguageNamed"));
}

public initTables() {
        addTable("countryDate", Country, DateClass.instance);
        addTable("country", Country);
}

public initProperties() {
        LP nameOriginCountry = addDProp(baseLM.baseGroup, "nameOriginCountry", getString("Наименование (ориг.)"), InsensitiveStringClass.get(50), Country);        
        LP sidCountry = addDProp(baseLM.baseGroup, "sidCountry", "Код страны", IntegerClass.instance, Country);
        LP countrySID = addAGProp("CountrySID", "Страна", sidCountry);

        sidOrigin2Country = addDProp(baseLM.baseGroup, "sidOrigin2Country", "Код 2 знака (ориг.)", StringClass.get(2), Country);
        sidOrigin2Country.setMinimumCharWidth(15);
        sidOrigin3Country = addDProp(baseLM.baseGroup, "sidOrigin3Country", "Код 3 знака (ориг.)", StringClass.get(3), Country);
        sidOrigin3Country.setMinimumCharWidth(15);

        currencyCountry = addDProp(baseLM.privateGroup, "currencyCountry", "Валюта", BL.getModule("Currency").getClassByName("Сurrency"), Сountry);
        nameCurrencyCountry = addJProp(baseLM.baseGroup, "nameCurrencyCountry", "Валюта", baseLM.name, currencyCountry, 1);
        nameCurrencyCountry.setPreferredCharWidth(10);

        isDayOffCountryDate = addDProp(baseLM.baseGroup, "isDayOffCountryDate", "Выходной", LogicalClass.instance, Country, DateClass.instance);
        defaultCountry = addDProp("defaultCountry", "Страна по умолчанию", Сountry);
        nameDefaultCountry = addJProp("nameDefaultCountry", "Страна по умолчанию", baseLM.name, defaultCountry);
}

public initNavigators()
{
        addFormEntity(new DaysOffFormEntity(catalogElement, "daysOffForm"));
}

private class DaysOffFormEntity extends FormEntity {
        public DaysOffFormEntity(NavigatorElement parent, String sID) {
            super(parent, sID, "Выходные дни");

            ObjectEntity objCountry = addSingleGroupObject(country, "Страна");
            objCountry.groupTo.initClassView = ClassViewType.PANEL;

            ObjectEntity objDays = addSingleGroupObject(DateClass.instance, "День");

            ObjectEntity objNewDate = addSingleGroupObject(DateClass.instance, "Дата");
            objNewDate.groupTo.setSingleClassView(ClassViewType.PANEL);

            addPropertyDraw(objCountry, baseLM.baseGroup);
            addPropertyDraw(objDays, baseLM.objectValue);
            addPropertyDraw(isDayOffCountryDate, objCountry, objDays);
            addPropertyDraw(objNewDate, baseLM.objectValue);
            addPropertyDraw(isDayOffCountryDate, objCountry, objNewDate);

            addFixedFilter(new NotNullFilterEntity(addPropertyObject(isDayOffCountryDate, objCountry, objDays)));
        }
}
Re[16]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.13 14:03
Оценка: +3 -1
Здравствуйте, _DAle_, Вы писали:

_DA>Ок, я тут нашел в репозитории старый код на джаве и тот вариант, на который его изначально переписали. Конечно, это далеко не одна конструкция, но там кто-то просил большой пример Это практически код некоторого очень простого модуля в системе. На практике преимущество DSL будет куда больше.


Ну, если честно, то, на мой взгляд, объем и сложность сопоставимы, особенно если джавовский вариант подрихтовать на предмет удобных инициализаторов, дабы избежать ненужных локальных переменных.
... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
AVK Blog
Re[28]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: Mamut Швеция http://dmitriid.com
Дата: 05.01.13 14:51
Оценка: +1
M>>По моеуй ссылке нигде не говорится, что изначально кода было в 10 раз больше. Это твои бурные фантазии.
WH>Обычно генерируют код не сильно отличающийся от рукописного.

Ну-ну.

M>>Например тут же рядом
Автор: _DAle_
Дата: 04.01.13
в примерах DSL, от которого нет никакого явного в 10 раз меньше кода. Но тебе ж наплевать. Ты предпочитаешь видеть только то, что тебе хочется видеть.

WH>Ну и что?
WH>Бывают случаи, когда ДСЛ не дает существенного сокращения.

О чем тут тебе хором несколько человек и говорят. Утверждения, что DSL всегда, обычно, почти всегда и т.п. на порядок короче надо доказывать. С доказательствами у тебя очень и очень туго.

M>>Или неправильный тип. Или неправильное количество аргументов. В общем — достаточно для того, чтобы провести внятный рефакторинг. На что способен компилятор DSLя?

WH>Он способен распознать старый синтаксис.

С чего это вдруг?

WH>И сказать, что нужно переделать.


С чего это вдруг?

WH>А в сочетании с ИДЕ еще и quick fix сделать.


А, ну да. Сказочки про белого бычка в виде Н2.

M>>И у нас примеры другие
Автор: _DAle_
Дата: 04.01.13
. Но я уже говорил, что опыт других людей для тебя «лож» ©™

WH>Так я и не о его примерах говорю.
WH>Я говорю про более сложные случаи.

А, ну как всегда. Если опыт других людей тебе не нравится, ты это называешь ложью. Уже вдруг DSLи не такие. Естественно, если они не будут иллюстрировать твои мысли, то они обязательно будут ложью, не такими, теорией и т.п.

WH>Например, пример из моего поста сейчас генерирует совершенно другой код.

WH>Сделано это было без изменения синтаксиса.

Да неужели.

WH>Параллельно Влад в другом бранче менял синтаксис на более человечный.


Ни ссылок ни примеров мы не дождемся, я так понимаю.


dmitriid.comGitHubLinkedIn
Re[29]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: WolfHound  
Дата: 05.01.13 15:16
Оценка: -1
Здравствуйте, Mamut, Вы писали:

WH>>Обычно генерируют код не сильно отличающийся от рукописного.

M>Ну-ну.
Ну, так покажи, что генерирует ДСЛ по твоей ссылке и что было, когда этот код писали руками?
Не можешь?

M>О чем тут тебе хором несколько человек и говорят. Утверждения, что DSL всегда, обычно, почти всегда и т.п. на порядок короче надо доказывать. С доказательствами у тебя очень и очень туго.

Так полно же ссылок когда разница на порядок другой.
А то, что можно просто изменить синтаксис на немного другой я с этим и не спорил.
Но когда делают что-то действительно серьезное, то там получается порядок.
Прямо как по твоей ссылке.

M>>>Или неправильный тип. Или неправильное количество аргументов. В общем — достаточно для того, чтобы провести внятный рефакторинг. На что способен компилятор DSLя?

WH>>Он способен распознать старый синтаксис.
M>С чего это вдруг?
С того что его этому очень просто обучить.

WH>>И сказать, что нужно переделать.

M>С чего это вдруг?
С того что его этому очень просто обучить.

WH>>А в сочетании с ИДЕ еще и quick fix сделать.

M>А, ну да. Сказочки про белого бычка в виде Н2.
Это не сказки. Многое из того о чем говорю уже работает.
Скоро доведем до состояния, когда можно будет показывать.

M>А, ну как всегда. Если опыт других людей тебе не нравится, ты это называешь ложью.

Ложною я называю лож.

M>Уже вдруг DSLи не такие. Естественно, если они не будут иллюстрировать твои мысли, то они обязательно будут ложью, не такими, теорией и т.п.

Нашел пример, где ДСЛ немного меняет синтаксис, и радуешься как ребенок.
При этом кучу ссылок, в том числе свою, где получается разница на порядок и больше, тупо игнорируешь.

WH>>Например, пример из моего поста сейчас генерирует совершенно другой код.

WH>>Сделано это было без изменения синтаксиса.
M>Да неужели.
А что тебя удивляет?
Раньше парсер сразу строил АСТ.
Теперь сначала заполняет хитрый массив интов, а потом отдельный код строит по нему АСТ.
Синтаксис языка при этом не изменился.

WH>>Параллельно Влад в другом бранче менял синтаксис на более человечный.

M>Ни ссылок ни примеров мы не дождемся, я так понимаю.
Через некоторое время Н2 будет в публичном доступе.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[30]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: Mamut Швеция http://dmitriid.com
Дата: 05.01.13 15:46
Оценка:
WH>>>Обычно генерируют код не сильно отличающийся от рукописного.
M>>Ну-ну.
WH>Ну, так покажи, что генерирует ДСЛ по твоей ссылке и что было, когда этот код писали руками?
WH>Не можешь?

Нет, потому что NDA, естественно. Но текущий DSL мало отличается от существовавшего библиотечного кода (если найду его, выложу). Главная проблема была в том, что его не могли править не-программисты, а не то, что в нем было 50к кода. Во многом ситуация была, как тут
Автор: _DAle_
Дата: 04.01.13
, но это же «лож»©™.


M>>О чем тут тебе хором несколько человек и говорят. Утверждения, что DSL всегда, обычно, почти всегда и т.п. на порядок короче надо доказывать. С доказательствами у тебя очень и очень туго.

WH>Так полно же ссылок когда разница на порядок другой.
WH>А то, что можно просто изменить синтаксис на немного другой я с этим и не спорил.
WH>Но когда делают что-то действительно серьезное, то там получается порядок.
WH>Прямо как по твоей ссылке.

Прямо по моей ссылке ты делаешь выводы, которых в этой ссылке нет. Но я давно знаю, что ты любишь видеть то, что тебе удобно видеть.


M>>>>Или неправильный тип. Или неправильное количество аргументов. В общем — достаточно для того, чтобы провести внятный рефакторинг. На что способен компилятор DSLя?

WH>>>Он способен распознать старый синтаксис.
M>>С чего это вдруг?
WH>С того что его этому очень просто обучить.

Да неужели? Ничего, что эта «легкость» зависит от многих факторов?

WH>>>А в сочетании с ИДЕ еще и quick fix сделать.

M>>А, ну да. Сказочки про белого бычка в виде Н2.
WH>Это не сказки. Многое из того о чем говорю уже работает.
WH>Скоро доведем до состояния, когда можно будет показывать.

Вот когда доведете, тогда и рассказывай.

M>>А, ну как всегда. Если опыт других людей тебе не нравится, ты это называешь ложью.

WH>Ложною я называю лож.

Нет, ложью ты называешь все, что тебе не нравится.

M>>Уже вдруг DSLи не такие. Естественно, если они не будут иллюстрировать твои мысли, то они обязательно будут ложью, не такими, теорией и т.п.

WH>Нашел пример, где ДСЛ немного меняет синтаксис, и радуешься как ребенок.
WH>При этом кучу ссылок, в том числе свою, где получается разница на порядок и больше, тупо игнорируешь.

Про свою ссылку я все сказал. Ты делаешь из нее выводы, которые из нее не делаются никак. Остальная «куча ссылок» просто напросто отсутствует. Потому что никакой кучи не существует, кроме ровно двух — на твой парсер и на ту Java-библиотеку по работе с какими-то сложными данными. Ими ты любишь размахивать, как флагом. Но даже на простое «приведи примеры» ты юлишь на протяжении пяти-шести сообщений, лишь бы их не предоставлять.

WH>>>Например, пример из моего поста сейчас генерирует совершенно другой код.

WH>>>Сделано это было без изменения синтаксиса.
M>>Да неужели.
WH>А что тебя удивляет?
WH>Раньше парсер сразу строил АСТ.
WH>Теперь сначала заполняет хитрый массив интов, а потом отдельный код строит по нему АСТ.
WH>Синтаксис языка при этом не изменился.

Да неужели это к твоей ребячей радости про изменение реализации DSL и уверенности, что в библиотеках придется менять интерфейс.


WH>>>Параллельно Влад в другом бранче менял синтаксис на более человечный.

M>>Ни ссылок ни примеров мы не дождемся, я так понимаю.
WH>Через некоторое время Н2 будет в публичном доступе.

Вот когда будет, тогда и стоит что-то про него говорить. Например даже на описываемое тобой изменение реализации без изменение синтаксиса. Ах, да «у меня все работает на моем компьютере», да.


dmitriid.comGitHubLinkedIn
Re[28]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.01.13 16:16
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


I>>А с языком именно это и надо, потому что мало людей которые скажем теорию категорий на раз понимают.

WH>Я уже вообще не понимаю, что ты сказать пытаешься.
WH>Причем тут теория категорий?

Это пример. Что бы придумать такую вещь как linq, нужна теория категорий. Разумеется, если рассматривать linq как нечто отличное от query comprehension. В другой облсти будет чтото другое.
Re[17]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: Ziaw Россия  
Дата: 06.01.13 17:09
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Ну, если честно, то, на мой взгляд, объем и сложность сопоставимы, особенно если джавовский вариант подрихтовать на предмет удобных инициализаторов, дабы избежать ненужных локальных переменных.


А на мой первый взгляд, оперировать понятиями CLASS, TABLE, OBJETCS, GROUPS, PROPERTIES, FILTERS гораздо лучше, чем понятиями DProp, AGProp, JProp, SingleGroupObject, NotNullFilterEntity.

Да, fluent интерфейс тут мог бы помочь, но его проектирование, разработка и поддержка не легче проектирования, разработки и поддержки отдельного DSL. Ибо это тоже DSL, только с очень ограниченным синтаксисом.
Re[15]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: Ziaw Россия  
Дата: 06.01.13 17:17
Оценка:
Здравствуйте, AlexRK, Вы писали:

_DA>>То что это "объявление функционала"/"добавление свойства" я и так сказал. Внутри там будет парсинг массива, маппинг каких-то одних объектов на другие, и добавление получившегося в результате объекта в какой-то контейнер. Не думаю, что станет сильно понятней, чем "добавление свойства".


ARK>Алгоритм по крайней мере понятен будет.


Алгоритм чего? Реализации? Это совершенно неинтересно при чтении вышележащего слоя логики. Где важно быстро понять, что алгоритм именно логики.

ARK>>> Чего? "Сразу понятно", угу. Может я тупой, но лично мне вся DSL-строка кажется полностью контр-интуитивной. Чего она делает, я до сих пор не понимаю.

_DA>>Хм, неужели действительно непонятно?
ARK>Так точно.

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

ARK>Лично мне было бы понятно что-то вроде:


  Скрытый текст
ARK>
ARK>f = function(x, y, z)
ARK>{
ARK>  return (h(x, y, z) != null) ? g(x, z) : null;
ARK>}
ARK>


ARK>или


ARK>
ARK>function f(x, y, z) is
ARK>  when h(x, y, z) is not null => g(x, z)
ARK>  else null;
ARK>


ARK>ну или еще что-то такое.


Насколько я понял, это не аналог, фишка в том, что функция определяется только в случае когда h(x, y, z) is not null, если это так, то синтаксис вполне нормальный. В вашем же случае функция есть всегда, но иногда возвращает null.
Re[18]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.13 18:14
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>А на мой первый взгляд, оперировать понятиями CLASS, TABLE, OBJETCS, GROUPS, PROPERTIES, FILTERS гораздо лучше, чем понятиями DProp, AGProp, JProp, SingleGroupObject, NotNullFilterEntity.


Чем лучше?

Z>Да, fluent интерфейс тут мог бы помочь, но его проектирование, разработка и поддержка не легче проектирования, разработки и поддержки отдельного DSL.


Даже не смешно.
... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
AVK Blog
Re[16]: А при чем тут DSL? (в продолжении темы о языках общего назначения)
От: AlexRK  
Дата: 06.01.13 19:27
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Алгоритм чего? Реализации? Это совершенно неинтересно при чтении вышележащего слоя логики. Где важно быстро понять, что алгоритм именно логики.


Ну, тут грань довольно тонкая...

Z>Это с непривычки. Видимо не использовали языков в которых есть подобный способ записи условий.


Вполне возможно.

Z>Насколько я понял, это не аналог, фишка в том, что функция определяется только в случае когда h(x, y, z) is not null, если это так, то синтаксис вполне нормальный. В вашем же случае функция есть всегда, но иногда возвращает null.


Ну вот видите, уже неочевидность.

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