Языково-ориентированное программирование: следующая парадигм
От: Сергей Дмитриев, Зверёк Харьковский (пер  
Дата: 02.03.06 16:55
Оценка: 545 (15) :)
Статья:
Языково-ориентированное программирование: следующая парадигма
Автор(ы): Сергей Дмитриев
Дата: 02.03.2006
Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.


Авторы:
Сергей Дмитриев, Зверёк Харьковский (перевод)

Аннотация:
Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.
FAQ — це мiй ай-кью!
Re: Языково-ориентированное программирование: следующая пара
От: CrazyPit  
Дата: 03.03.06 13:32
Оценка:
Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод), Вы писали:

Тема интересная и актуальная. А когда будет доступна полная версия в электронном виде?
Re: Языково-ориентированное программирование: следующая пара
От: Зверёк Харьковский  
Дата: 16.03.06 21:10
Оценка: 42 (5) :)
Статья в свежей компьютерре на ту же тему:
http://offline.computerra.ru/2006/630/258015/

2rsdn team: может, выложить уже полную версию, а?
FAQ — це мiй ай-кью!
Re[2]: Языково-ориентированное программирование: следующая п
От: fionbio  
Дата: 18.03.06 09:42
Оценка: +5
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>Статья в свежей компьютерре на ту же тему:

ЗХ>http://offline.computerra.ru/2006/630/258015/

ЗХ>2rsdn team: может, выложить уже полную версию, а?


Изучать подход DSL, игнорируя Common Lisp и другие лиспы — всё равно,
что марксизм учить, не читавши Маркса, физику, не зная, кто такой Эйнштейн,
с той мотивацией, что "я умный, сам всё придумаю". Лисп может нравиться или
не нравиться, но в среде лисперов есть огромные наработки на тему DSL,
и проходить мимо них мне кажется, как минимум, неразумным.

http://www.maxkir.com/sd/languageWorkbenches.html#4
Re[2]: Языково-ориентированное программирование: следующая п
От: Зверёк Харьковский  
Дата: 20.03.06 13:51
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>2rsdn team: может, выложить уже полную версию, а?


up. Есть кто живой?
FAQ — це мiй ай-кью!
Re[3]: Языково-ориентированное программирование: следующая п
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 21.03.06 06:57
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>>2rsdn team: может, выложить уже полную версию, а?

ЗХ>up. Есть кто живой?

небольшое уточнение — ты считаешь, что именно этот перевод надо выложить раньше всех остальных не выложенных статей, в том числе из #4 (как бы это объяснить их авторам?) или что вообще надо немедленно выложить все невыложенные в online статьи из журнала?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Языково-ориентированное программирование: следующая п
От: Зверёк Харьковский  
Дата: 21.03.06 20:24
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

ЗХ>>>2rsdn team: может, выложить уже полную версию, а?

ЗХ>>up. Есть кто живой?

OE>небольшое уточнение — ты считаешь, что именно этот перевод надо выложить раньше всех остальных не выложенных статей, в том числе из #4 (как бы это объяснить их авторам?) или что вообще надо немедленно выложить все невыложенные в online статьи из журнала?


Ладно, закроем этот вопрос для ясности. А то флейм выйдет.
FAQ — це мiй ай-кью!
Re: Языково-ориентированное программирование: следующая пара
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 27.03.06 08:57
Оценка: 2 (1)
Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод)

Может в данной теме это и оффтопик, но вот статья о другом подходе к разработке DSL, на основе существующего языка (Ruby, как можно было догадаться ):
Creating DSLs with Ruby

Broadly speaking, there are two ways to create a DSL. One is to invent a syntax from scratch, and build an interpreter or compiler. The other is to tailor an existing general-purpose language by adding or changing methods, operators, and default actions. This article explores using the latter method to build a DSL on top of Ruby.


Взято из Ruby Code &amp; Style.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: Языково-ориентированное программирование: следующая пара
От: Didro Россия home~pages
Дата: 07.04.06 17:03
Оценка:
С трудом формализуемые в возбудившемся от количества новых парадигм студенческом мозге родились два вопроса:


Спасибо.
Re[2]: Языково-ориентированное программирование: следующая п
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.04.06 17:56
Оценка: +1 -2
Здравствуйте, Didro, Вы писали:

D>С трудом формализуемые в возбудившемся от количества новых парадигм студенческом мозге родились два вопроса:


Плюнь на парадигмы. А вот возбудившийся мозг — это хорошо.

D>

D>Спасибо.

Пожалуйста.

PS.: Не заморачивайся с "парадигмами". Большие Дяди(TM) пытаются навешать друг другу лапшу на уши, и поднять на этом толику денег. А остальные ведутся на квазинаучную терминологию.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Языково-ориентированное программирование: следующая п
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.04.06 22:30
Оценка: :)
Здравствуйте, Didro, Вы писали:

D>
  • Насколько описанные в статье (из КТ) идеи соотносятся с идеями, заложенными в R#? Просто читая статью «Ориентация на язык» то тут, то там всплывают аналогии с высказываниями из статьи про R#.

    Идеи пересекаются просто потому что речь идет о разных реализациях одного и того же подхода/прадигым.

    D>
  • Применяется ли сегодня (новая для меня) парадигма\методология КОП(COP, компонентно-ориентированное программирование, в классическом варианте «Component-Oriented Programming = Polymorphism + (Really)Late Binding + (Real) Information Hiding»). И если да, правильно ли считать, что просто КОП находится на другом(более низком) уровне абстракции разработки ПО нежели Метапрограммирование. И что обе эти парадигмы могут дополнять друг друга? Т.е. с помощью инструментов Метапрограммирования мы описываем предметную область, а при генерации кода используем идеи КОП. (сказанное звучит поверхностно, поскольку нет глубокого понимания идей ни той, ни другой парадигмы).

    КОП и МП могут прекрасно существовать вместе и дополнять друг-друга. КОП больше ориентируется на рантайм, а МП на реализацию. Но они имеют общую задачу. Обе парадигмы призваны упростатить разработку сложных систем путем выделения в программах отдельных частей которыми можно оперировать как высокоуровневыми сущьностями.

    МП может помогать реализовывать компонентые идеи. А метакод может быть организован в виде компонентов. Например, правила R# и макросы Nemerle по сути являются компонентами, так как подгружаются компилятором во время его работы.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
  • Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: Языково-ориентированное программирование: следующая пара
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 14.04.06 08:29
    Оценка: 1 (1)
    Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод), Вы писали:

    СДЗ>Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.


    ИМХО, сильно бросается в глаза то, что автор отталкивается от Java (язык и стиль использования которого располагают к многословности
    Автор: eao197
    Дата: 31.03.06
    ) и от IDE для Java. Естественно, что в этом случае в качестве недостатков существующего положения дел приводится:

    Программиста ограничивает зависимость от инфраструктуры, которую нельзя изменить – в частности, языков программирования и сред разработки. Если мне нужно некоторое расширение языка, придется подождать, пока его внесет автор. Если мне нужны дополнительные функции в IDE, придется ждать, пока это сделает производитель. Эти-то зависимости и ограничивают мою свободу.

    Что, как следствие, приводит к очевидной необходимости добавления еще одного инструмента, MPS

    А между тем:

    Ruby attacks the productivity problem by making the core elements as expressive as possible, so the programmer doesn't have to rely on IDEs and other tools on top of the language to get stuff done. Few programmers today would even consider doing Java without Eclipse/IDEA or C# without Visual Studio, but lots of programmers happily write Ruby code in good text editors that aren't born with specialization for one particular language, like TextMate for OS X, which is the big hit in Ruby/Rails circles.

    Вместо Ruby, имхо, с таким же успехом можно подставить Nemerle, Lisp или Smalltalk


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[2]: Языково-ориентированное программирование: следующая п
    От: dshe  
    Дата: 14.04.06 09:05
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>А между тем:

    E>

    E>Ruby attacks the productivity problem by making the core elements as expressive as possible, so the programmer doesn't have to rely on IDEs and other tools on top of the language to get stuff done. Few programmers today would even consider doing Java without Eclipse/IDEA or C# without Visual Studio, but lots of programmers happily write Ruby code in good text editors that aren't born with specialization for one particular language, like TextMate for OS X, which is the big hit in Ruby/Rails circles.

    E>Вместо Ruby, имхо, с таким же успехом можно подставить Nemerle, Lisp или Smalltalk

    Smalltalk в этом списке, наверное, лишний. Я не гуру в Smalltalk'е, но вот, что я нашел:
    http://www.smalltalk.ru/articles/smalltalk.html

    Интегрированная среда разработки (IDE)

    Традиционно, среда разработки Smalltalk считается самой продуктивной с точки зрения программирования. С момента появления языка, среда была неотъемлемой его частью. Это была одной из его главных концепций — программирование посредством манипулирования реальными объектами, быстрое прототипирование и эволюционный дизайн.

    ...

    --
    Дмитро
    Re[3]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 14.04.06 09:17
    Оценка: +1 :)
    Здравствуйте, dshe, Вы писали:

    D>Smalltalk в этом списке, наверное, лишний.


    Smalltalk я упомянул не потому, что им можно пользоваться без IDE (какому-нибудь Smalltalk-еру такое бы предложить ), а потому, что синтаксис и динамическая типизация Smalltalk-а способствуют созданию internal DSL-ей на самом языке Smalltalk.
    См. например: здесь или здесь
    Автор: Andrei N.Sobchuck
    Дата: 18.10.05


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re: Языково-ориентированное программирование: следующая пара
    От: Disappear  
    Дата: 14.04.06 16:15
    Оценка: 4 (1)
    Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод), Вы писали:

    СДЗ>Статья:

    СДЗ>Языково-ориентированное программирование: следующая парадигма
    Автор(ы): Сергей Дмитриев
    Дата: 02.03.2006
    Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.


    СДЗ>Авторы:

    СДЗ> Сергей Дмитриев, Зверёк Харьковский (перевод)

    СДЗ>Аннотация:

    СДЗ>Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.


    Мне кажется, что ЯОП — это слишком "высокий полет", даже в ближайшие 5-8 лет. А вот если спуститься пониже то нас могут ждать такие замечательные парадигмы как СОП (субъектно-ориентированное программирование)
    Все наверное читали эту статью:
    http://offline.computerra.ru/2006/633/262140/

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

    Есть неплохая лекция на эту тему:
    дамы и господа! Герб Саттер
    http://www.parc.com/cms/get_article.php?id=533
    Re: Языково-ориентированное программирование: следующая пара
    От: fionbio  
    Дата: 14.04.06 19:08
    Оценка: 6 (1)
    Часть I. Почему defmacro.
    Часть II. Синдром NIH — бич нашей отрасли.
    Re: Языково-ориентированное программирование: следующая пара
    От: Maxim S. Shatskih Россия  
    Дата: 15.04.06 16:22
    Оценка: 1 (1) -3
    Плохая парадигма. Много лишнего труда — сначала создать язык, а потом на этом языке решить задачу.

    Смесь нескольких языков — это кошмар в поддержке.

    Гуевыми конструкторами и визардами почти ничего серьезного и реально работающего не сделаешь, это давно известно.
    Занимайтесь LoveCraftом, а не WarCraftом!
    Re[2]: Языково-ориентированное программирование: следующая п
    От: Maxim S. Shatskih Россия  
    Дата: 15.04.06 16:24
    Оценка:
    D>
  • Применяется ли сегодня (новая для меня) парадигма\методология КОП(COP, компонентно-ориентированное программирование, в классическом варианте «Component-Oriented Programming = Polymorphism + (Really)Late Binding + (Real) Information Hiding»).

    Да. Это COM.
  • Занимайтесь LoveCraftом, а не WarCraftом!
    Re: Языково-ориентированное программирование: следующая пара
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 15.04.06 22:39
    Оценка: 6 (2) +3 -2
    Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод), Вы писали:

    ИМХО закоренелого консерватора

    Я скажу грубость, но статья откровенно фантазёрская.
    Это конечно очень замечательно брать существующие DSL'и придумывать новые и проч. ит проч., но чрезмерное использование DSL порождает больше проблем чем, пользы. В том числе
    1. Надёжность
      Не секрет, что даже самый простой язык сложно учить. Базовая часть SQL один из самых простых языков, но даже с её помошью можно наворотить весьма и весьма трудноотлаживаемые конструкции. Нельзя создать абсолютно дуракозащищённую систему. Даже самые передовые промышленные языки типа C# имеют свои грабли. Где же гарантия, что DSL'ы будут и достаточно мощными, и лишёнными граблей? А нет такой гарантии. Почему многие используют MFC? Библиотека-то так себе. потому что есть огромный опыт использования и если случилось что-то плохое, то скорее всего ты не первый и известно как с этим бороться. А это, заметьте, в рамках Си++, всего одна библиотека. А если новый язык?
    2. Языки
      В результате, если раньше человек учил один язык и грабли одного языка, то теперь он будет учить 5-6 языков и грабли 5-6 языков. Насколько реально заставить среднего специалиста учить 5-6 языков? А вообще много ли программистов действительно (со всеми граблями) знает больше 3-4 языков?
    3. Диалекты
      Вот много ли специалостов по БД знают синтаксис MS SQL, Oracle, Postgre и MySQL так чтобы набирать и отлаживать код без подглядывания в документацию? А ведь это даже не разные языки. Разные языки это не беда. Хотя Си++ и C# внешне очень похожи, всё же за 5-6 секунд можно понять на каком языке написан код. А вот поймете ли вы написан код на C# 1.0 или C# 2.0 так же быстро? Диалекты это очень серьёзная проблема ведущая к тотальной несовместимости. Взять к примеру Си++. Где гарантия что DSL будучи однажды придуманным не будет меняется? Скорее наоборот, есть гарантия, что он объязательно будет меняться. Хорошо если это приведёт к ошибкам компиляции, а если кто-то решит, что логическая операция NOT должна иметь меньший приоритет, чем AND, потому что так правильнее?
    4. Совместимость
      Между языками нужны мостики. Будет ли это CLR (C# <-> VB.Net), COM (C++ <-> Delphi), ADO (Anything <-> SQL), но этот мостик должен быть. Автор подозрительно умалчивает об этой технической проблеме. А ведь она одна из важнейших. Причём ведь ещё очень хочеться не проиграть в производительности. Ну по крайней мере не очень сильно.
    5. Взаимозаменяемость, обучение
      На каждый используемый язык нужно минимум 2-3 человека которые будут его знать, а иначе проект будет очень зависим от конкретных личностей. А если таких языков 10? Причём если Си++, Java, C# это общепринятые языки, то нанять человека знающего DSL внутреней разработки просто нельзя. Значит увеличивается время ввода в курс дела нового сотрудника. Кроме того DSL внутренней разработки это такая штука у которой есть автор и все остальные. И когда уходит автор, новый автор начинает его переделывать под себя. Внутренние разработки всегда имеют личностный и проектный налёт и очень редко действительно универсальны.
    6. Поддержка
      Поддержка всего этого хозяйства тоже не подарок. Так же как и координация разработки. Кто-то мыслит кортежами, кто-то списками, кто-то массивами, кто-то хешами, потому что в их DSL другого нет. Координировать всё это должен человек-оркестр, который всех понимает и переводит всех для всех. Ну и где такого взять? Вы видели много проектов где логика действительно грамотно разделена между прилодением и БД, так чтобы и поддерживать было легко и производительность высокая? А ведь это всего 2 языка. а если 5?

    В целом к введению в проект новых языков надо относиться очень осторожно. Не надо уподобляться ООН, где большая часть сотрудников это армия переводчиков, которая что-то постоянно синхронно и асинхронно переводит, а большая часть бюджета — их зарплаты.
    Должны быть очень серьёзные причины чтобы заставлять людей учить новый язык (я думаю изучение языка программирования по сложности сопоставимо с человеческим языком). У нас, помимо языка общего назначения — русского, есть не так уж много DSL'ей. Математические знаки (физика пользуется математическими знаками) и химические. Других я и не припомню. Если нам в жизни хватило всего 3х языков, зачем их плодить в программировании и называть это прогрессом, когда вместо разработки продукта у нас будет вавилонское столпотворение?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[2]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.04.06 23:54
    Оценка: +2
    Здравствуйте, adontz, Вы писали:

    Покури на досуге Nemerle и уверен, что твое мнение резко изменится.

    Что до DSL-ей, то ты их все равно будешь изобретать и использовать так как без них сложные задачи практически не решаются. Вопрос только в том будут ли это чистые и интуитивно понятные решения или эмуляция (например, на базе объектов) кривыми средствами устаревшего языка.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 00:03
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Покури на досуге Nemerle и уверен, что твое мнение резко изменится.


    Это не аргумент. Вон тут кое-кто регулярно Оберон хвалит Да, с виду всё зашибись, а ты этот Немерле в реальном проекте над которым далеко не самые талантливые сыны отчества трудулись использовал?

    VD>Что до DSL-ей, то ты их все равно будешь изобретать и использовать так как без них сложные задачи практически не решаются.

    VD>Вопрос только в том будут ли это чистые и интуитивно понятные решения или эмуляция (например, на базе объектов) кривыми средствами устаревшего языка.

    Для убедительности (это не подкол) привёл бы при пример задачи которая с DSL будет решаться интуитивно понятно, а без "за счёт эмуляции на базе объектов кривыми средствами устаревшего языка".
    Считать, что уже есть Си++/C#/Java и SQL.

    А заодно и трудозатраты на создание DSL, освоение DSL и т.д. хорошобы подсчитать. Я так понимаю, что раз ты защищаешь этот подход, значит использовал его на практике, ну так расскажи мне о реальных цифрах
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[2]: Языково-ориентированное программирование: следующая п
    От: Зверёк Харьковский  
    Дата: 16.04.06 00:15
    Оценка: 1 (1) +2
    Здравствуйте, adontz, Вы писали:

    A>ИМХО закоренелого консерватора: Я скажу грубость, но статья откровенно фантазёрская.


    Когда я переводил эту статью, она была мне интересна чисто теоретически. На данный момент, подход мною используется практически — но не в стиле Дмитриева, а в стиле in-language DSL, о которых говорил eao197
    Автор: eao197
    Дата: 14.04.06


    С "высоты" уже практического опыта, могу сказать, что ни с одной из описанных тобой сложностей (пока?) не сталкивался вообще, благодаря малому размеру DSL-ей.

    Пример (мой, из текущего проекта):
    class Something
    #...
      data :price, Float, :default => 1.0, :validate => lambda{|val| val >= 0.0}
    #...
    end

    (это все, что нужно для описания поля — по этому описанию создается геттер, сеттер, валидатор, инициализатор, загрузка из БД, выгрузка в БД).

    Еще пример: тулза под названием rake — это make на Ruby in-language DSL, отличное описание, почти не требующее знания Руби, сделал Фаулер:
    task :main => [:errata, :articles]
    
    #many lines of build code
    
    file 'build/eaaErrata.html' => 'eaaErrata.xml' do
      # build logic
    end
    task :errata => 'build/eaaErrata.html'

    (читается "задача main требует выполнения задач errata, articles; файл eaaErrata.html получается из файла eaaErrata.xml выполнением таких-то действий; задача errata требует получения файла eaaErrata.html"

    То есть — 2-3 новых "ключевых слова" + "самоописующий" синтаксис (требует очень гибкого базового синтаксиса — динамический Ruby и статический Nemerle этому условию удовлетворяют, не говоря уж о классических Lisp/Smalltalk) — и voila.
    Это just works в реальной жизни.

    В таком, примерно, аспекте.
    FAQ — це мiй ай-кью!
    Re[4]: Языково-ориентированное программирование: следующая п
    От: Зверёк Харьковский  
    Дата: 16.04.06 00:20
    Оценка: 13 (3) +3
    Здравствуйте, adontz, Вы писали:

    A>Для убедительности (это не подкол) привёл бы при пример задачи которая с DSL будет решаться интуитивно понятно, а без "за счёт эмуляции на базе объектов кривыми средствами устаревшего языка".

    A>Считать, что уже есть Си++/C#/Java и SQL.

    Вообще говоря, любое создание иерархии классов (или набора функций), отражающих предметную область — и есть создание DSL'я (о чем вполне однозначно говорит Дмитриев в статье). Просто мы это "так не называем".

    То есть вот это — тоже DSL (надуманный пример на несуществующем языке):
    window = new Window
    button = new Button
    button.size = (100, 25)
    button.caption = 'WTF?'
    window.layout(button)


    Другое дело — что Дмитриев считает необходимым создать кучу визуальных тулзов, явно поддерживающих такой подход; а мы с Владом внезапно сошлись на том, что достаточно одного языка с ОЧЕНЬ выразительным синтаксисом.
    FAQ — це мiй ай-кью!
    Re[2]: И еще
    От: Зверёк Харьковский  
    Дата: 16.04.06 00:32
    Оценка:
    Здесь лежит ссылка на статью того же Фаулера и довольно интересное обсуждение:
    http://gzip.rsdn.ru/Forum/Message.aspx?mid=1569069&amp;only=1
    Автор: Зверёк Харьковский
    Дата: 29.12.05
    FAQ — це мiй ай-кью!
    Re[5]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 00:33
    Оценка:
    Здравствуйте, Зверёк Харьковский, Вы писали:

    ЗХ>Другое дело — что Дмитриев считает необходимым создать кучу визуальных тулзов, явно поддерживающих такой подход;


    ИМХО это не эффективный подход. Как ни смешно, но редактируя формочки .Net мне зачастую проще и быстрее покопаться в файле Designer.cs, чем щёлкать мышью.

    ЗХ>а мы с Владом внезапно сошлись на том, что достаточно одного языка с ОЧЕНЬ выразительным синтаксисом.


    А, ну я тут с вами тоже соглашусь, но я ещё не помню случая, чтобы плюсы доставались без минусов. Простой пример шаблоны vs дженерики. Шаблоны в конечном итоге элементарно удобнее когда дело касается вызова операторов или даже функций о которых известно лишь имя и число параметров. Выразительность потрясающая, возможности огромные, но отладка этого добра не самое приятное занятие. А дженерики? Убожество убожеством, Никаких существенных проблем, кроме проблемы приведения типов они не решили. Ну а с другой сторны и хлопот с ними на порядок меньше.
    Nemerle это чудесно пока на нём пишете ты с Владом (может и мне присоединиться? ), ну а когда на нём будет писать Вася Пупкин? Вот ведь в чём вопрос. Можно напридумывать кучу гениальных вещей, но до промышленного использования доходят не гениальные идеи, а общепонятные.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[6]: Языково-ориентированное программирование: следующая п
    От: Зверёк Харьковский  
    Дата: 16.04.06 00:40
    Оценка:
    Здравствуйте, adontz, Вы писали:

    ЗХ>>Другое дело — что Дмитриев считает необходимым создать кучу визуальных тулзов, явно поддерживающих такой подход;


    A>ИМХО это не эффективный подход. Как ни смешно, но редактируя формочки .Net мне зачастую проще и быстрее покопаться в файле Designer.cs, чем щёлкать мышью.


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

    ЗХ>>а мы с Владом внезапно сошлись на том, что достаточно одного языка с ОЧЕНЬ выразительным синтаксисом.


    A>Nemerle это чудесно пока на нём пишете ты с Владом (может и мне присоединиться? ),


    Я не пишу на Немерле

    A>...ну а когда на нём будет писать Вася Пупкин? Вот ведь в чём вопрос. Можно напридумывать кучу гениальных вещей, но до промышленного использования доходят не гениальные идеи, а общепонятные.


    Мняяя... аргумент по сути, видимо, верный, но мне малоинтересный — я выбираю только то, чем нравится пользоваться лично мне. Промышленная эффективность — как-то
    FAQ — це мiй ай-кью!
    Re[7]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 00:51
    Оценка:
    Здравствуйте, Зверёк Харьковский, Вы писали:

    ЗХ>Да вот фиг его знает. Люды кажуть, что, к примеру, IDE, поддерживающая сложный рефакторинг, на порядок увеличивает продуктивность. Я там ниже в треде сослался на статью Фаулера — так вот он, в том числе, пишет и о том, насколько нужны визуальные тулзы.


    А какая есть визуальная поддержка рефакторинга? Переименовать класс/метод? И сё? Не густо.
    Нет, я не против DSL. Например я уже давно набираю структуру БД вот в таком виде
    [I] - 32bit integer
    [L] - 64bit integer
    [S] - string
    [G] - guid
    [D] - datetime
    [T] - text
    
    [PK] - primary key
    [PK-N] - composite primary key
    [UK] - unique key
    [UK-N] - composite unique key
    [FK(table.column)] - foreign key
    
    [user_list]
        [G] user_id [PK]
        [S] user_login [UK-1]
        [S] user_domain [UK-1]
        [S] user_password
        [I] user_role
            administrator, user
        [T] user_cryptkey_private
        [T] user_cryptkey_public
        [D] user_timestamp

    По очень простой причине — так легче править руками. DDL SQL очень громоздкий, когда надо просто понять какие у нас будут таблицы и столбцы. Делать это в Visio и даже Excel не удобно — я пытался. Удобнее в Visual Studio открыть текстовый файл и писать вот в таком вот формате. Но это моя персональная фенечка, которая удобна лично мне. Я в таком виде структуру БД никому не отдам и уж тем более не потребую, чтобы мне её приносили в таком виде.

    ЗХ>Мняяя... аргумент по сути, видимо, верный, но мне малоинтересный — я выбираю только то, чем нравится пользоваться лично мне. Промышленная эффективность — как-то


    А мне летать, а мне летать, а мне летать охота...
    Ну раз такие аргументы не интересны, других у меня и не было
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[4]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 00:58
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Это не аргумент. Вон тут кое-кто регулярно Оберон хвалит Да, с виду всё зашибись, а ты этот Немерле в реальном проекте над которым далеко не самые талантливые сыны отчества трудулись использовал?


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

    VD>>Что до DSL-ей, то ты их все равно будешь изобретать и использовать так как без них сложные задачи практически не решаются.

    VD>>Вопрос только в том будут ли это чистые и интуитивно понятные решения или эмуляция (например, на базе объектов) кривыми средствами устаревшего языка.

    A>Для убедительности (это не подкол) привёл бы при пример задачи которая с DSL будет решаться интуитивно понятно, а без "за счёт эмуляции на базе объектов кривыми средствами устаревшего языка".

    A>Считать, что уже есть Си++/C#/Java и SQL.

    Таких задач масса. Вот тебе ради хохмы пример отличной пенисометрии демонстриующей силу ДСЛ-ей:
    Версия 0.04
    Автор: Oyster
    Дата: 14.04.06

    сравни его с С++-реализацией:
    [Nemerle] Семантический контроль над размерностями
    Автор: Oyster
    Дата: 05.04.06

    это тоже в общем-то ДСЛ, но язык менее выразительный и все проблемы недоДСЛей вылезают очень сильно. Сравни декларацию типов, да и оцени использование физических литералов.

    Из других примеров... Как тебе строки со слйсами в стиле Руби или Перла:
    $"Summa = $(a + b)..."


    A>А заодно и трудозатраты на создание DSL,


    Трудозатраты зависят от языка. Если пытаться создавать ДСЛ-и на С++, то конечно проблем не оберешся. Затраты могут сильно перевешивать бенефиты и реальное приемущество будет получено только в очень универсальных случаях. Но если есть нечто вроде макросов Немерле, то создание ДСЛ-ей становится сравнимым с созданием библиотеки.

    A>освоение DSL и т.д. хорошобы подсчитать.


    Этот скепсис от непонимания чем отличается ДСЛ от ЯП общего назначения. ДСЛ — это очень простой язык решающих ограниченный набор задач предметной области (ДСЛ — язык специфичный для предметной области).

    ДСЛ-и очень просты в освоении и менее подвержены ошибкам, так как не универсальны, что позволяет ограничивать их только корректными описаниями (все некооректное должно быть синтаксически не верным).

    A> Я так понимаю, что раз ты защищаешь этот подход, значит использовал его на практике, ну так расскажи мне о реальных цифрах


    Ты тут как-то набросился на мою статью о конфигурации. Так вот как раз она описывала ДСЛ-подход средствами ЯП не преднозначенного для разработки ДСЛ-ей.

    А вообще, ДСЛ — это можно сказать отдельная парадигма. Прогрмму можно представить как набор ДСЛ-ей и описание на них самой программы. При таком подходе объем кода резко сокращается, а его надежность увеличивается.

    Кстати, SQL — это ДСЛ дотсупа к реляционным данным. Так что ты и сам не раз использовал ДСЛ-и, но не думал о них как парадигме. Если же осознать эту парадигму, то твой арсенал может резко увеличиться и ты сожешь решать многие задачи проще.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 01:15
    Оценка: :))
    Здравствуйте, Зверёк Харьковский, Вы писали:

    ЗХ>Другое дело — что Дмитриев считает необходимым создать кучу визуальных тулзов, явно поддерживающих такой подход; а мы с Владом внезапно сошлись на том, что достаточно одного языка с ОЧЕНЬ выразительным синтаксисом.


    Да уж. Не часто мы сходимся на 100%, так что в этом однозначно что-то есть.

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

    Пользуясь случаем передаю привет С.Губанову.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 01:15
    Оценка: 1 (1) +1 :)
    Здравствуйте, adontz, Вы писали:

    A>ИМХО это не эффективный подход. Как ни смешно, но редактируя формочки .Net мне зачастую проще и быстрее покопаться в файле Designer.cs, чем щёлкать мышью.


    Забавно, что код генерируемый дизайнерами тоже является ДСЛ-ем и даже имеет свой интерпретатор и не полностью совместим с C# или VB. А сам дизайнер это визаулизатор этого ДСЛ-я и по совместительству свой ДСЛ.

    В общем, ДСЛ — это больше парадигма (образ видения программы), чем кокретное вополщение.

    A>А, ну я тут с вами тоже соглашусь, но я ещё не помню случая, чтобы плюсы доставались без минусов. Простой пример шаблоны vs дженерики. Шаблоны в конечном итоге элементарно удобнее когда дело касается вызова операторов или даже функций о которых известно лишь имя и число параметров.


    Боюсь, что для этого куда удачнее использовать функциональные типы. Опять же погляди на Немерле и поймешь, что и тут С++ не лучший пример.

    A> Выразительность потрясающая, возможности огромные, но отладка этого добра не самое приятное занятие. А дженерики? Убожество убожеством, Никаких существенных проблем, кроме проблемы приведения типов они не решили. Ну а с другой сторны и хлопот с ними на порядок меньше.


    Дык, дженерики — это хорошее решение конкретной проблемы. В отличии от С++-шаблонов они просто неспособны решать другие задачи.
    Так вот хороший ДСЛ — это тоже "хорошее решение конкретной проблемы".

    A>Nemerle это чудесно пока на нём пишете ты с Владом (может и мне присоединиться? ), ну а когда на нём будет писать Вася Пупкин? Вот ведь в чём вопрос. Можно напридумывать кучу гениальных вещей, но до промышленного использования доходят не гениальные идеи, а общепонятные.


    Васи Пупкину можно дать в руги уже результат труда квалифицированного программиста. Макросы Немерле — это сборки подключаемые через референсы (как простые сборки, да они ими и являются). Так что создать макрос внутри проекта невозможно. И тот кто отвечает за проект может легко контролировать какие макросы используются и кто их создает.

    К тому же в отличии от С++ Немрле несравнимо проще. Да и ошибок дизайна в языке куда меньше. Для обобщенного кода используются те же дженерики. А для более хитрых вещей макросы. Сам же язык даже более безопасен и прост чем C#.

    ЗЫ

    В общем, я последний месяц его изучаю и не перестаю удивляться насколько грамотно он спроектирован. Если бы не проблемы вроде отсутсвия полноценной поддержки IDE, ошибки и недоработки в компиляторе и отсуствие хорошей документации (хотя над этим мы уже и сами работаем) я бы вообще забыл про другие языки. В общем, я просто в восторге от этого языка. Мое мнение — это реальный прорыв в мэйнстрим-языках! Это то что я так долго искал.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[2]: Языково-ориентированное программирование: следующая п
    От: CrazyPit  
    Дата: 16.04.06 05:35
    Оценка: 76 (4) :)
    Здравствуйте, adontz, Вы писали:

    A>Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод), Вы писали:


    A>
  • Надёжность
    A>Не секрет, что даже самый простой язык сложно учить. Базовая часть SQL один из самых простых языков, но даже с её помошью можно наворотить весьма и весьма трудноотлаживаемые конструкции. Нельзя создать абсолютно дуракозащищённую систему. Даже самые передовые промышленные языки типа C# имеют свои грабли. Где же гарантия, что DSL'ы будут и достаточно мощными, и лишёнными граблей? А нет такой гарантии. Почему многие используют MFC? Библиотека-то так себе. потому что есть огромный опыт использования и если случилось что-то плохое, то скорее всего ты не первый и известно как с этим бороться. А это, заметьте, в рамках Си++, всего одна библиотека. А если новый язык?
    A> [поскипано]


    Надёжность
    Не секрет, что даже самую простую библиотеку сложно учить. Базовая часть StandartIOLib одная из самых простых библиотек, но даже с её помошью можно наворотить весьма и весьма трудноотлаживаемые конструкции. Нельзя создать абсолютно дуракозащищённую систему. Даже самые передовые промышленные языки типа Algol68 имеют свои грабли. Где же гарантия, что библиотеки будут и достаточно мощными, и лишёнными граблей? А нет такой гарантии. Почему многие используют PDP1? Машинка так себе. потому что есть огромный опыт использования и если случилось что-то плохое, то скорее всего ты не первый и известно как с этим бороться. А это, заметьте, в рамках , всего одна машина. А если новая библиотека?

    ......................

    Библиотеки

    В результате, если раньше человек учил один ассемблер и грабли одной машины, то теперь он будет учить язык высокого уровня да ещё 5-6 библиотек и грабли 5-6 библиотек. Насколько реально заставить среднего специалиста учить 5-6 библиотек? А вообще много ли программистов действительно (со всеми граблями) знает больше 3-4 библиотек?

    ..................

    На каждую используемую библиотеку нужно минимум 2-3 человека которые будут её знать, а иначе проект будет очень зависим от конкретных личностей. А если таких библиотек 10? Причём если набор комнанд процессора 8086 всем известен, то нанять человека знающего библиотеку внутреней разработки просто нельзя. Значит увеличивается время ввода в курс дела нового сотрудника. Кроме того библиотеки внутренней разработки это такая штука у которой есть автор и все остальные. И когда уходит автор, новый автор начинает её переделывать под себя. Внутренние разработки всегда имеют личностный и проектный налёт и очень редко действительно универсальны.



    --------------------------------

    A>Должны быть очень серьёзные причины чтобы заставлять людей учить новый язык (я думаю изучение языка программирования по сложности сопоставимо с человеческим языком). У нас, помимо языка общего назначения — русского, есть не так уж много DSL'ей. Математические знаки (физика пользуется математическими знаками) и химические. Других я и не припомню. Если нам в жизни хватило всего 3х языков, зачем их плодить в программировании и называть это прогрессом, когда вместо разработки продукта у нас будет вавилонское столпотворение?


    А если серьёзно, вы так говорите, как будто DSL будут такие же сложные как языки программирования, они в большинстве случаев намного проще и соотвественно всё что вы сказали "слегка" преувеличено. Я уже приводил пример, миниязыки в Unix сообществе используяться постоянно — чистый LOP, никто не жалуеться — учит. Или ActiveRecord и Hibernate чем не DSL?
  • Re[2]: Языково-ориентированное программирование: следующая п
    От: Дарней Россия  
    Дата: 16.04.06 07:48
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>

    ИМХО закоренелого консерватора

    Я скажу грубость, но статья откровенно фантазёрская.


    Ты не только консерватор, ты еще и догматик
    Сам себе создал дракона, сам же его и убил.
    DSL — это не язык в том же понимании, что и C++, и даже не SQL. Это намного меьше, и в то же время — больше. Типичный DSL не обязательно должен отвечать критерию о Тьюринг-полноте (и даже лучше, если он не будет ему отвечать). Он должен всего лишь просто и эффективно решать одну очень узкую и ограниченую задачу. Для понимания сути DSL лучше подумать о регулярных выражениях или XPath.
    SQL, конечно, когда-то задумывался как DSL, но со временем к нему приделали императивные расширения синтаксиса и кучу других нестандартных расширений, которые извратили изначальную идею. [off] Да и его стандартный синтаксис далек от идеала, если хорошо подумать. Авторы слишком много задумывались об идеологии, и слишком мало о практике.[/off]
    Ситуация, когда разные разработчики решают одну и ту же задачу разными DSL, полностью аналогична ситуации, когда один разработчик использует для построения GUI Qt, а другой wxWindows. И решается она такими же средствами, то есть при помощи стальной линейки или розг — в зависимости от вкусов руководителя проекта
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Всех излечит, исцелит
    добрый Ctrl+Alt+Delete
    Re[5]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 10:36
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Таких задач масса. Вот тебе ради хохмы пример отличной пенисометрии демонстриующей силу ДСЛ-ей:

    VD>Версия 0.04
    Автор: Oyster
    Дата: 14.04.06

    VD>сравни его с С++-реализацией:
    VD>[Nemerle] Семантический контроль над размерностями
    Автор: Oyster
    Дата: 05.04.06

    VD>это тоже в общем-то ДСЛ, но язык менее выразительный и все проблемы недоДСЛей вылезают очень сильно. Сравни декларацию типов, да и оцени использование физических литералов.

    Сравнил, оценил. Слабенько. То есть внешне прикольно, а вот на кто на деле использует разные системы мер в одной программе? Зато как я понял так не сделать
    length_t x = 3;
    length_t y = 5;
    length_t z = 9;
    volume_t v = x * y; // упс, забыли z, нихрена не скомпилируется.


    Ладно забили, идею, что DSL это абстракция, а не сущность я уже понял

    VD>Трудозатраты зависят от языка. Если пытаться создавать ДСЛ-и на С++, то конечно проблем не оберешся.


    Например boost:spirit?

    VD>Этот скепсис от непонимания чем отличается ДСЛ от ЯП общего назначения. ДСЛ — это очень простой язык решающих ограниченный набор задач предметной области (ДСЛ — язык специфичный для предметной области).


    DSL это синтаксически очень простой язык. Влад, даже в пределах оператора SELECT можно такого наворотить.... А весь синтаксис с примерами помещается на 5 страниц.

    VD>Ты тут как-то набросился на мою статью о конфигурации.


    Как видишь, я набрасываюсь на все статьи, так что запомни — это не личное, я просто злой и вредный вообще.

    VD>Так вот как раз она описывала ДСЛ-подход средствами ЯП не преднозначенного для разработки ДСЛ-ей.


    Аээээ ну так вообще любой конфигурационный файл давай обзовём DSL'ем. А-а-а-а DSL'и нас окружили, они нападают
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[3]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 10:37
    Оценка:
    Здравствуйте, CrazyPit, Вы писали:

    За стёб 5+

    CP>А если серьёзно, вы так говорите, как будто DSL будут такие же сложные как языки программирования, они в большинстве случаев намного проще и соотвественно всё что вы сказали "слегка" преувеличено.


    Время покажет.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[6]: Языково-ориентированное программирование: следующая п
    От: Дарней Россия  
    Дата: 16.04.06 10:46
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Аээээ ну так вообще любой конфигурационный файл давай обзовём DSL'ем.


    собственно, так оно и есть

    A>А-а-а-а DSL'и нас окружили, они нападают


    а то ж
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Всех излечит, исцелит
    добрый Ctrl+Alt+Delete
    Re[3]: Языково-ориентированное программирование: следующая п
    От: GlebZ Россия  
    Дата: 16.04.06 13:48
    Оценка: 25 (2) +1
    Здравствуйте, CrazyPit, Вы писали:

    Проблема в том, что если ты ошибся в самой реализации языка, и на нее уже написал код, то при изменении оного получишь на порядок больше проблем чем при изменении библиотеки(которая обладает ясным интерфейсом). Поэтому стоимость ошибки в языке значительно больше чем стоимость ошибки в библиотеке.
    Пока нету нормального автоматизированного рефакторинга, сравнивать с библиотеками не стоит.

    С уважением, Gleb.
    Re[4]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 16.04.06 14:38
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Это не аргумент. Вон тут кое-кто регулярно Оберон хвалит Да, с виду всё зашибись, а ты этот Немерле в реальном проекте над которым далеко не самые талантливые сыны отчества трудулись использовал?


    Не в первый раз я слышу сравнение обсуждения Nemerle с "обсуждением" Оберона. И всё-таки хочу заметить, что сторонники Nemerle на форуме всё же стараются аргументированно отстаивать свою точку зрения (например — приводить
    Автор: Oyster
    Дата: 22.02.06
    примеры
    Автор: Oyster
    Дата: 26.02.06
    исходников
    Автор: Oyster
    Дата: 05.04.06
    ) — достаточно почитать форум, чтобы понять это.

    А вот что мне как раз не нравится, так это странные вроде_бы_как_оппоненты, которые заявляют, что Nemerle есть очередная туфта, даже не удосужившись его попробовать (что совсем несложно) хотя бы на небольшом проектике. Нет, ничего личного, — я вообще говорю...
    Re[6]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 16.04.06 14:47
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Сравнил, оценил. Слабенько. То есть внешне прикольно, а вот на кто на деле использует разные системы мер в одной программе?


    Сравнивать предлагали реализацию на C++ и Nemerle. Понятно, что эта библиотека никому нафик не нужна (и тем не менее, тут на форуме утверждали, что на Nemerle она не решается — этот факт также подтолкнул меня к написанию решения на Nemerle ).

    A>Зато как я понял так не сделать

    A>
    A>length_t x = 3;
    A>length_t y = 5;
    A>length_t z = 9;
    A>volume_t v = x * y; // упс, забыли z, нихрена не скомпилируется.
    A>

    Плохо понял — в таком случае именно что не скомпилируется (у величин разные размерности, и проверка этого будет выполняться на этапе компиляции; собственно, задача библиотеки и была вынести подобные проверки на этап компиляции), чего и требуется Ты бы попробовал хоть для начала...
    Re[6]: Языково-ориентированное программирование: следующая п
    От: WolfHound  
    Дата: 16.04.06 15:14
    Оценка: +2
    Здравствуйте, adontz, Вы писали:

    A>Сравнил, оценил. Слабенько. То есть внешне прикольно, а вот на кто на деле использует разные системы мер в одной программе? Зато как я понял так не сделать

    A>
    A>length_t x = 3;
    A>length_t y = 5;
    A>length_t z = 9;
    A>volume_t v = x * y; // упс, забыли z, нихрена не скомпилируется.
    A>

    Плохо ты понял... Смотри лучше.

    VD>>Трудозатраты зависят от языка. Если пытаться создавать ДСЛ-и на С++, то конечно проблем не оберешся.

    A>Например boost:spirit?
    Жутик еще тот... а если вспомнить boost::lambda...
    ... << RSDN@Home 1.1.4 beta 6a rev. 436>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[6]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 15:39
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Сравнил, оценил. Слабенько.


    Слабенько? И что слабенько? Сравни чистоту описания и возможность использования просто таки литералов физ.величин с тем что получается на С++.
    По-моему, разница настолько очевидна, что и говорить не о чем.

    А ведь С++-решение использует почти 100% языка, то есть идет на грани возоможностей языка. Меж тем результат получается не очень замечательный. Описание физ.величин запутанное и непонятное. О физ. литералах вообще речи не идет. А сообщения об ошибках?

    Меж тем у Немерла есть огромный запас прочности. Так что ты тут явно не прав.

    A> То есть внешне прикольно, а вот на кто на деле использует разные системы мер в одной программе? Зато как я понял так не сделать

    A>
    A>length_t x = 3;
    A>length_t y = 5;
    A>length_t z = 9;
    A>volume_t v = x * y; // упс, забыли z, нихрена не скомпилируется.
    A>


    A>Ладно забили, идею, что DSL это абстракция, а не сущность я уже понял


    Ты почитай тему сначала, и за одно почитай тему на которую ссылается оная. Так как раз и идет речь о том, что во время компиляции осуществляется контроль над преобразованием величин и их корректным использованием.

    Так то ты просто не понял сути.

    VD>>Трудозатраты зависят от языка. Если пытаться создавать ДСЛ-и на С++, то конечно проблем не оберешся.


    A>Например boost:spirit?


    Да, например. Только Спирит тоже идет на пределе возможностей С++. По сему имеет кучу ограничений и проблем (как например плохая диагностика ошибок и невозможность отладки метакода).

    Меж тем Немерле позволяет решить подобную задачу вообще без ограничений.

    A>DSL это синтаксически очень простой язык. Влад, даже в пределах оператора SELECT можно такого наворотить.... А весь синтаксис с примерами помещается на 5 страниц.


    SQL — это пример границы между ДСЛ и полноценным языком. Потому он так сложен.

    A>Как видишь, я набрасываюсь на все статьи, так что запомни — это не личное, я просто злой и вредный вообще.


    Ну, ну... Ты себя оговаривашь. Что-то критики С++-статей от тебя не много.

    VD>>Так вот как раз она описывала ДСЛ-подход средствами ЯП не преднозначенного для разработки ДСЛ-ей.


    A>Аээээ ну так вообще любой конфигурационный файл давай обзовём DSL'ем. А-а-а-а DSL'и нас окружили, они нападают


    Дык так оно и есть. Просто те кто не систематизировал свои взгляды этого пока не замечают.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 16:13
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>А вот что мне как раз не нравится, так это странные вроде_бы_как_оппоненты, которые заявляют, что Nemerle есть очередная туфта, даже не удосужившись его попробовать (что совсем несложно) хотя бы на небольшом проектике. Нет, ничего личного, — я вообще говорю...


    Нет-нет, не туфта. Конечно же нет. Я ведь не говорю, что Nemerle это плохо, а спрашиваю сможет ли его осилить среднестатистический программист? А ведь это необходимое условие широкого использования языка.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[6]: Языково-ориентированное программирование: следующая п
    От: WolfHound  
    Дата: 16.04.06 16:49
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Нет-нет, не туфта. Конечно же нет. Я ведь не говорю, что Nemerle это плохо, а спрашиваю сможет ли его осилить среднестатистический программист? А ведь это необходимое условие широкого использования языка.

    Может. Если не пытаться писать макросы (а использовать уже готовые. Стандартные или написанные кемто другим не суть важно.) то он не сложнее чем C#.
    ... << RSDN@Home 1.1.4 beta 6a rev. 436>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[7]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 17:04
    Оценка: -3
    Здравствуйте, Oyster, Вы писали:

    A>>Зато как я понял так не сделать

    A>>
    A>>length_t x = 3;
    A>>length_t y = 5;
    A>>length_t z = 9;
    A>>volume_t v = x * y; // упс, забыли z, нихрена не скомпилируется.
    A>>

    O>Плохо понял — в таком случае именно что не скомпилируется (у величин разные размерности, и проверка этого будет выполняться на этапе компиляции; собственно, задача библиотеки и была вынести подобные проверки на этап компиляции), чего и требуется Ты бы попробовал хоть для начала...

    Я как раз хорошо понял. В исходном примере все типы выводились и получалось, что v = x * y — площадь вне зависимости от того, что я имел ввиду. Явно указывать типы это на самом деле очень полезно. А чтобы их указывать явно и гибко нужны нормальные шаблоны.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[7]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 17:04
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Слабенько? И что слабенько? Сравни чистоту описания и возможность использования просто таки литералов физ.величин с тем что получается на С++.

    VD>По-моему, разница настолько очевидна, что и говорить не о чем.

    Тут есть ещё и проблемы практического использования. Написать 10 kg то круто, а вот 10kg, а 10кг? А ведь это более естественно Да и где гарантия, что никто не забудет это самое k. Ошибка в 1000 раз на пустом месте.
    Мне подход с явным указанием типов, а не суффиксов, нравиться больше. Кроме того, с использованием разного рода typeof (к сожалению он пока не стандартизирован) такие вещи можно делать и в Си++. И, учитывая, что Nemerle язык новый, а Си++ старый, я бы это рассматривал как большой плюс Си++. Хотя конечно на Nemerle всё удобнее.

    VD>А ведь С++-решение использует почти 100% языка, то есть идет на грани возоможностей языка. Меж тем результат получается не очень замечательный. Описание физ.величин запутанное и непонятное. О физ. литералах вообще речи не идет.


    +1. Обозначения не соответствуют физической номенклатуре. Вопрос в том, хороши ли такое соответствие в программе? Я бы не стал однозначно говорить да или нет.

    VD>А сообщения об ошибках?


    Тут ты не прав. Сообщения посредством некоторых техник можно сделать вполне внятными.

    VD>Ты почитай тему сначала, и за одно почитай тему на которую ссылается оная. Так как раз и идет речь о том, что во время компиляции осуществляется контроль над преобразованием величин и их корректным использованием.


    Влад, видишь ли какое дело, на все случаи жизни суффиксов не напасёшься. В физике три основополагающие величины — масса, длина, время и через единицы их измерения можно выразить любые другие единицы. И возможность написать value_t<1, 1, -2> для обозначения ньютона ИМХО очень полезно. Не всегда получаются базовые единицы и какие ты суффиксы придумаешь для производной ускорения по расстоянию я не знаю. А выводить тип из выражения, значить по сути лишать себя проверки типов вообще.

    VD>Да, например. Только Спирит тоже идет на пределе возможностей С++. По сему имеет кучу ограничений и проблем (как например плохая диагностика ошибок и невозможность отладки метакода).


    ИМХО спирит это штука из серии "показать себя", нежели "принести пользу".

    VD>Ну, ну... Ты себя оговаривашь. Что-то критики С++-статей от тебя не много.


    Да их самих не много
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[4]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 17:38
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    GZ>Проблема в том, что если ты ошибся в самой реализации языка, и на нее уже написал код, то при изменении оного получишь на порядок больше проблем чем при изменении библиотеки(которая обладает ясным интерфейсом). Поэтому стоимость ошибки в языке значительно больше чем стоимость ошибки в библиотеке.

    GZ>Пока нету нормального автоматизированного рефакторинга, сравнивать с библиотеками не стоит.

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

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

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

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

    Что касается рефакторинга и т.п. Согласен, средства автоматизации всегда полезны. Но не надо их противопоставлять самому принципу. Иначе выходит, что заниматься ООП на VB.NET или VC++ вообще невозможно, так как для оных просто не существует полноценных средств автоматического рефакторинга.

    Меж тем код ДСЛ-ей легче поддается неавтоматизированному рефакторингу. Да и реже его требует. Ведь мы уже описываем специфичную и четко ограниченную информацию. Причем описываем явными синтаксическми средствами. Это в большинстве случаев позволяет обходиться банальными заменами по контексту вместо испоьзования умных утилит.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 17:38
    Оценка:
    Здравствуйте, Дарней, Вы писали:

    Д>Типичный DSL не обязательно должен отвечать критерию о Тьюринг-полноте (и даже лучше, если он не будет ему отвечать).


    Золотые слова! ДСЛ наоборот должен быть максимально декларативе и отражать только специфичную для предметной области инфромацию.

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

    Чем более декларативны конструкции ДСЛ-ы, тем более он выразительен!

    Д> Он должен всего лишь просто и эффективно решать одну очень узкую и ограниченую задачу. Для понимания сути DSL лучше подумать о регулярных выражениях или XPath.


    Ага. И отличный пример тому встравивание регуляных выражений в Немерле.
    regexp match (str)
    { | "a+.*" => printf("a\n");
      | @"(?<num : int>\d+)-\w+" => printf("%d\n", num + 3);
      | "(?<name>(Ala|Kasia))? ma kota" =>
         match(name)
         { | Some (n) => printf("%s\n", n)
           | None => printf("noname?\n")
         }
      | _ => printf("default\n");
    }


    Д>Ситуация, когда разные разработчики решают одну и ту же задачу разными DSL, полностью аналогична ситуации, когда один разработчик использует для построения GUI Qt, а другой wxWindows. И решается она такими же средствами, то есть при помощи стальной линейки или розг — в зависимости от вкусов руководителя проекта


    +1
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 17:42
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

    A>>Аээээ ну так вообще любой конфигурационный файл давай обзовём DSL'ем. А-а-а-а DSL'и нас окружили, они нападают


    VD>Дык так оно и есть. Просто те кто не систематизировал свои взгляды этого пока не замечают.


    Влад тут дело не в систематизации. От того что я обозвал конфигурационный файл DSL'ом мне ну никаких удобств не добавилось.
    Причислять существующую сущность к некоторому классу сущностей полезно всего в одном случае, когда этот класс сущностей хорошо изучен и мы можем использовать для сущности операции определённые над классом.
    DSL'и же составляют класс сущностей с которым не ясно что делать и от того что ты туда за уши притянули ещё один DSL никому проще жить не стало.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[5]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 17:50
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Это не верная логика. На ошибочном язые вообщен невозможно корректно описать задачу. Так что менять будет нечего.


    Это не верная логика. В какой момент ты поймёшь что язык ошибочен? В тот момент когда ты уже решил на нём часть задачи и понял что оставшаяся часть не решается. Так что потери очень даже есть. Так же как и два пути решения проблемы: переписать язык и потерять совметимость с уже существующими решениями на этом языке и дописать язык, изуродовать в каком-то смысле, зато оставить совместимость.

    VD>Изменения конечно возможны, но многие именения в ДСЛ-е не будут задействовать граматики, а скорее будут расширять семантику или делать ее более строгой.


    Я уже приводил пример. Пусть поменяются приоритеты операций. Это оставит код компилирующимся, но сделает логически ошибочным. А переправлять это всё руками ой какая работа.. легче всё заново написать

    VD>ДСЛ тем и хорош, что он прост. В простом трудно ошибиться и его легко проверить.


    Влад, создаётся впечатление, что DSL это панацея от всех бед. Я не видел ещё ни одного простого и в тоже время эффективного промышленного языка, даже в пределах предметной области.
    А наколеночные поделки не интересны — их и так плодят пачками.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[8]: Языково-ориентированное программирование: следующая п
    От: WolfHound  
    Дата: 16.04.06 18:14
    Оценка: +2
    Здравствуйте, adontz, Вы писали:

    A>Тут есть ещё и проблемы практического использования. Написать 10 kg то круто, а вот 10kg, а 10кг? А ведь это более естественно Да и где гарантия, что никто не забудет это самое k. Ошибка в 1000 раз на пустом месте.

    Суффиксы как и вобще вся эта библиотека сделаны по приколу. К томуже суффикс g можно и не вводить...

    A>Влад, видишь ли какое дело, на все случаи жизни суффиксов не напасёшься.

    A>В физике три основополагающие величины — масса, длина, время
    ЙО! Это по меньшей мере на Нобелевскую хотя скорее на Шнобелевскую пермию тянет...
    A>и через единицы их измерения можно выразить любые другие единицы. И возможность написать value_t<1, 1, -2> для обозначения ньютона ИМХО очень полезно.
    А мне нравится задавать так
    [Oyster.Units.Macros.UnitsDefinition([
        // SI
        basisUnits (Si)
        (
            Mass[ kg ],
            Length[ m ],
            Time[ sec ],
            Temperature[ K ],
            CurrentStrength[ A ],
            LightIntensity,
            QuantityOfSubstance
        ),
    
        basisAliases (Si)
        (
            Area = (Length ^ 2),
            Volume = Area * Length,
            Velocity = Length / Time,
            Acceleration = Velocity / Time,
            AngularVelocity = Velocity,
            AngularAcceleration = Acceleration,
            Density = Mass / Volume,
    
            Force = Mass * Acceleration,
            SpecificGravity = Mass / (Length ^ 2) / (Time ^ 2),
            Pressure = SpecificGravity * Length,
    
            LinearMomentum = Mass * Velocity,
            MomentOfInertia = Mass * Area,
    
            Energy = Force * Length,
            Power = Energy / Time,
    
            DynamicViscosity = Mass / Length / Time,
            KinematicViscosity = DynamicViscosity,
    
            HeatCapacity = Energy / Temperature,
            Entropy = HeatCapacity,
            SpecificHeat = HeatCapacity / Mass,
            SpecificEntropy = SpecificHeat,
    
            Charge = Time * CurrentStrength,
            LinearDensityOfCharge = Charge / Length,
            SurfaceDensityOfCharge = Charge / Area,
            ElectricFluxDensity = SurfaceDensityOfCharge,
            PackedDensityOfCharge = Charge / Volume,
    
            Voltage = Power / CurrentStrength,
            ElectricForce = Force / CurrentStrength,
            Resistance = Voltage / CurrentStrength,
            SpecificResistance = Resistance * Length,
    
            Permittance = Time / Resistance,
    
            CurrentDensity = CurrentStrength / (Length ^ 2)
        ),
    
        // CGS
        units (Cgs)
        (
            Mass[ g ] - 1.0 / 1000.0,
            Length[ cm ] - 1.0 / 100.0,
            Time,
            Temperature,
            CurrentStrength - 1.0 / 3000000000.0,
            LightIntensity,
            QuantityOfSubstance
        ),
    
        // Other units
        units (_)
        (
            HorsePower = Power - 1471.0 / 2.0
        )
    ])]
    // Using fake class here otherwise definition won't work - looks like a bug:
    // http://nemerle.org/forum/viewtopic.php?t=223
    class FakeForDef {}

    В прочем на С++ тоже можно задавать велечины в таком стиле... Например так
    Автор: WolfHound
    Дата: 19.05.05
    . Вот только что-то мне подсказывает что понять КОД который делает это возможным смогут единици.
    A>Не всегда получаются базовые единицы и какие ты суффиксы придумаешь для производной ускорения по расстоянию я не знаю. А выводить тип из выражения, значить по сути лишать себя проверки типов вообще.
    Бред то какой... ты бы хоть в вопросе разобрался чтоли... в Nemerle можно явно задавать типы... Причем ты можешь задавать тип не только переменным но и частям выражения. А параметры методов обязаны быть заданы явно.
    ... << RSDN@Home 1.1.4 beta 6a rev. 436>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[9]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 18:34
    Оценка: :)))
    Здравствуйте, WolfHound, Вы писали:

    A>>В физике три основополагающие величины — масса, длина, время

    WH>ЙО! Это по меньшей мере на Нобелевскую хотя скорее на Шнобелевскую пермию тянет...

    Если ты намекаешь (как следует из кода ниже — да) на всякие Амперы, Кельвины, то надо заметить что их употребление традиция, а не необходимость. Температуру можно замечательно измерять в джоулях, а что касается Ампера, то смотрим определение

    Ампер равен силе такого постоянного тока, который, будучи пущен по двум прямым параллельным проводникам бесконечной длины и с незначительным поперечным сечением, помещёнными на расстоянии в 1 метр друг от друга в вакууме, создавал бы между этими проводниками силу, равную 2·10-7 ньютонов на метр длины.

    Размерность напрашивается сама собой. Ну и так далее, так что давай не будем про физику

    WH>так
    Автор: WolfHound
    Дата: 19.05.05
    . Вот только что-то мне подсказывает что понять КОД который делает это возможным смогут единицы.


    Это не аргумент. Ты сам говоришь что макросы Nemerle не все смогут понять. Так что шило на мыло. Да и не думаю я что с приходом нового языка ситуация с разделением на тех кто пишет прикладные библиотеки и тех кто их использует изменится.

    WH>Бред то какой... ты бы хоть в вопросе разобрался чтоли... в Nemerle можно явно задавать типы... Причем ты можешь задавать тип не только переменным но и частям выражения. А параметры методов обязаны быть заданы явно.


    Да, я понимаю, что можно. Вопрос в другом. Если написать что-то вроде
    "auto_type v = x * y", то v будет иметь тип x * y. А если написать "volume_t v = x * y", то всё очень замечательно, до тех пор пока слева у тебя базовые типы, а если нет? В Nemerle есть шаблоны параметризуемые не типами?
    template <int length, int mass, int time>
    class physical_value
    {
    }

    Бывает?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Языково-ориентированное программирование: следующая
    От: WolfHound  
    Дата: 16.04.06 19:22
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Это не аргумент. Ты сам говоришь что макросы Nemerle не все смогут понять.

    Не понять макросы Nemerle может только конченый Гашиш Кумар.
    A>Так что шило на мыло. Да и не думаю я что с приходом нового языка ситуация с разделением на тех кто пишет прикладные библиотеки и тех кто их использует изменится.
    Тут сложность неколько разного порядка. Я понимаю то что написал Oyster в своей библиотеке довольно легко. И это при том что с Nemerle я не работал. Так пару раз компилятор запускал для мелких эксперементов и все.
    В то же время я с большим трудом понимаю как работает мой код который я ниписал по ссылке. И это при том что С++ я знаю очень хорошо. И написал на нем не один проект.

    WH>>Бред то какой... ты бы хоть в вопросе разобрался чтоли... в Nemerle можно явно задавать типы... Причем ты можешь задавать тип не только переменным но и частям выражения. А параметры методов обязаны быть заданы явно.

    A>Да, я понимаю, что можно. Вопрос в другом. Если написать что-то вроде
    A>"auto_type v = x * y", то v будет иметь тип x * y. А если написать "volume_t v = x * y", то всё очень замечательно, до тех пор пока слева у тебя базовые типы, а если нет? В Nemerle есть шаблоны параметризуемые не типами?
    Нет. И не надо. Учи матчасть. Посмотри как это реализовано и не говори глупостей.
    ... << RSDN@Home 1.1.4 beta 6a rev. 436>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[8]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 19:32
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Я как раз хорошо понял. В исходном примере все типы выводились и получалось, что v = x * y — площадь вне зависимости от того, что я имел ввиду. Явно указывать типы это на самом деле очень полезно. А чтобы их указывать явно и гибко нужны нормальные шаблоны.


    Теб же трое сказили, что ты не прав, и что тебе нужно внимательнее читать.

    Еще раз, последний. На Немерле обеспечивается олный контроль типов. Немерл без проблем позволяет как задавать типы явно, так и выводить и автоматически. Если у гого-то возникает параноя, то он всегда может добавить к любому выражению конструкцию " : тип" и компилятор будет контролировать тип выражения. Это же справидливо и для объявления переменной:
    def x : int = любое_выражение;

    "x" будет иметь тип int независимо от того, что за тип выводится из "любое_выражение". Если тип несовместим или требует рантайм-приведения, то компилятор просто откажется компилитовать код.

    Надесь, на этом данная дискусиия будет закрыта.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 19:32
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Тут есть ещё и проблемы практического использования. Написать 10 kg то круто, а вот 10kg, а 10кг?


    Пошли поиски заусенцев для придирок. Ничего более существенного в голову не пришло?

    Ладно отвечу. "kg" для языка — это оператор. Так что как ты его напишешь "10 kg" или "10kg" роли играть не должно (я прав? это я к автору библиотеки обращаюсь). А вот "кг" конечно не пройдет. Но не потому, что есть фзические окраничения, а просто потому, что "кг" не описан. Опиши его и будет прохдить и он.

    A> А ведь это более естественно Да и где гарантия, что никто не забудет это самое k. Ошибка в 1000 раз на пустом месте.


    Нда. Тяжолый случай. Рассуждения без малейшено понимания о предмете рассуждения. Еше раж. "10" и "10 kg" разные типы данных для языка. "10" — это int, а "10 kg" это 10 килограм, то есть другой тип данных. Так как нет неявного приведения, то они несовместимы и компилятор выдаст ошибку.

    A>Мне подход с явным указанием типов, а не суффиксов, нравиться больше.


    Используй его. Ты единственный кому это нравится, но это не проблема. Первая версия именно так и делала. Но нашелся орел вроде тебя кому показалось, что "10 kg" более понятно.

    A> Кроме того, с использованием разного рода typeof (к сожалению он пока не стандартизирован) такие вещи можно делать и в Си++.


    Языком. А на Немерле можно сейчас и довольно просто.

    A>И, учитывая, что Nemerle язык новый, а Си++ старый, я бы это рассматривал как большой плюс Си++. Хотя конечно на Nemerle всё удобнее.


    Логика изумительная. Нет слов! Тогда давай PL1 рассматр как идеальный язык. Оно ведь куда старше.

    Короче, мне все меньше и меньеш интересен этот разговр. Стоять на своем морьщась от боли ты можешь в грдом одиночисте.

    VD>>А сообщения об ошибках?


    A>Тут ты не прав.


    Только тут? И на том спасибо.

    A> Сообщения посредством некоторых техник можно сделать вполне внятными.


    В С++-то? Хран с два. Он просто не имеет соотвествующих констркций. Это все равно будут извращения на побочных эффектах. А вот в Немерле не только можно, но и сделано. Там сообщение об ошибке — это вызов метода.

    VD>>Ты почитай тему сначала, и за одно почитай тему на которую ссылается оная. Так как раз и идет речь о том, что во время компиляции осуществляется контроль над преобразованием величин и их корректным использованием.


    A>Влад, видишь ли какое дело, на все случаи жизни суффиксов не напасёшься.


    Каков смысл этих слов? Да и речь не о суфиксах. Это так, дополнительная фенька. Которую фиг реализушь разными плюсами.

    A> В физике три основополагающие величины — масса, длина, время и через единицы их измерения можно выразить любые другие единицы. И возможность написать value_t<1, 1, -2> для обозначения ньютона ИМХО очень полезно.


    "value_t<1, 1, -2>"- это бред сивой кобылы. Эта строчка только в очень багатом воображении может оказаться осмысленной. Между тем имея полноценный ДСЛ описывающий взамиоотношения типов ты в силах описать любую комбинацию очень кратко и понятно.

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


    Ясно. "Сам я автора не читал, но как и весь Советский народ...". Читайте автора, сэр.

    VD>>Да, например. Только Спирит тоже идет на пределе возможностей С++. По сему имеет кучу ограничений и проблем (как например плохая диагностика ошибок и невозможность отладки метакода).


    A>ИМХО спирит это штука из серии "показать себя", нежели "принести пользу".


    Ну, вот она и демонстрирует, что показать себя С++ не удается. Отсюда и отношение. А на Немерле встроенный парсер выглядит очень гормонично, так как есть все средства и для его создания, и для бесшевной игтеграции его в основной язык.

    VD>>Ну, ну... Ты себя оговаривашь. Что-то критики С++-статей от тебя не много.


    A>Да их самих не много


    Их как раз не мало.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 19:32
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>В какой момент ты поймёшь что язык ошибочен?


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

    A> В тот момент когда ты уже решил на нём часть задачи и понял что оставшаяся часть не решается.


    Еще раз. Ты и строчки не напишешь на реверном языке. Язык подразумевает продумывание констркций иотладку. Это как библиотечные классы и функции. Если ты не создал библиотеку, то и использовать их не выйдет.

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

    A>Я уже приводил пример. Пусть поменяются приоритеты операций. Это оставит код компилирующимся, но сделает логически ошибочным. А переправлять это всё руками ой какая работа.. легче всё заново написать


    Какие на фиг приоритеты в ДСЛ-я? Снова ведешь разговор о том, что не доконца понимашь. Вот тебе пример ДЧЛ-я вводящего синтаксическую конструкцию упрощающую работу с регулярными выражениями:
    regexp match (str)
    { | "a+.*" => printf("a\n");
      | @"(?<num : int>\d+)-\w+" => printf("%d\n", num + 3);
      | "(?<name>(Ala|Kasia))? ma kota" =>
         match(name)
         { | Some (n) => printf("%s\n", n)
           | None => printf("noname?\n")
         }
      | _ => printf("default\n");
    }

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

    Так вот большинство конструкций даже проще. Многие макросы имеют вид функций, но ведут себя более разумно (генерируют разный код в зависимости от входа).

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

    Так что ошибиться в описании ДСЛ-я куад сложенее чем при проектировании библиотеки.

    VD>>ДСЛ тем и хорош, что он прост. В простом трудно ошибиться и его легко проверить.


    A>Влад, создаётся впечатление, что DSL это панацея от всех бед. Я не видел ещё ни одного простого и в тоже время эффективного промышленного языка, даже в пределах предметной области.

    A>А наколеночные поделки не интересны — их и так плодят пачками.

    Нда. И где я уже видил эту аргументацию? А, у АВК. Когда аргументы по делу кончаются, то почему-то сразу начинаются "аргументы" вроде "Это что серебрянная пуля? Их не быват... Не пудрите мне мозги...".

    Это следующий шаг в развитии индустрии программировния. Сама по себе концпция ДСЛ-ей не избавит от решения задач. Но во многих случаях она позволит решать задачи более просто, а значит решать более сложные задачи и решать их быстрее. Как ООП, ФП и другие парадигмы эта позволяет увеличить сложность решаемых задач впихнув их в довольно скудные возможности мозга человека.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 16.04.06 19:37
    Оценка: +2
    Здравствуйте, adontz, Вы писали:

    A>Я как раз хорошо понял. В исходном примере все типы выводились и получалось, что v = x * y — площадь вне зависимости от того, что я имел ввиду. Явно указывать типы это на самом деле очень полезно. А чтобы их указывать явно и гибко нужны нормальные шаблоны.


    Так ты указывай в коде, что ты имеешь в виду. Конкретно для моей библиотеки такой вот код:

    def a : Si.Area = 10 m * 15 m

    Приведёт к ошибке во время компиляции, т.к. площадь — это не объём. Насколько я понимаю, это именно то, что тебе нужно?
    Re[8]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 16.04.06 19:37
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Тут есть ещё и проблемы практического использования. Написать 10 kg то круто, а вот 10kg, а 10кг? А ведь это более естественно Да и где гарантия, что никто не забудет это самое k. Ошибка в 1000 раз на пустом месте.


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

    Кстати, если не нравятся физические литералы, то пиши явно:

    def m = Si.Mass(10)

    В общем, опять началась охота на ведьм Советую снова — попробуй Nemerle и мою библиотеку в действии, прежде чем критиковать их.

    A>Мне подход с явным указанием типов, а не суффиксов, нравиться больше.


    Опять же — можно вообще не использовать физические литералы, а указывать типы явно. Ты не уловил идею, видимо.

    A>Кроме того, с использованием разного рода typeof (к сожалению он пока не стандартизирован) такие вещи можно делать и в Си++. И, учитывая, что Nemerle язык новый, а Си++ старый, я бы это рассматривал как большой плюс Си++. Хотя конечно на Nemerle всё удобнее.


    Тут вообще не понял, о чём ты — какие вещи можно делать с использованием typeof на C++? Вообще исходная библиотека была написана на C++ и так, если ты об этом, вот только мне лично её исходники не очень по душе...

    VD>>А ведь С++-решение использует почти 100% языка, то есть идет на грани возоможностей языка. Меж тем результат получается не очень замечательный. Описание физ.величин запутанное и непонятное. О физ. литералах вообще речи не идет.


    A>+1. Обозначения не соответствуют физической номенклатуре. Вопрос в том, хороши ли такое соответствие в программе? Я бы не стал однозначно говорить да или нет.


    Ты всё про физические литералы? А Влад больше об описании физических величин
    Автор: Oyster
    Дата: 10.04.06
    .

    VD>>Ты почитай тему сначала, и за одно почитай тему на которую ссылается оная. Так как раз и идет речь о том, что во время компиляции осуществляется контроль над преобразованием величин и их корректным использованием.


    A>Влад, видишь ли какое дело, на все случаи жизни суффиксов не напасёшься. В физике три основополагающие величины — масса, длина, время и через единицы их измерения можно выразить любые другие единицы. И возможность написать value_t<1, 1, -2> для обозначения ньютона ИМХО очень полезно. Не всегда получаются базовые единицы и какие ты суффиксы придумаешь для производной ускорения по расстоянию я не знаю. А выводить тип из выражения, значить по сути лишать себя проверки типов вообще.


    Да причём тут суффиксы!!!

    Кстати, ты всерьёз считаешь, что value_t<1, 1, -2> удобнее хоть в каком-то случае? кстати, тебе бы пришлось писать value_t<1, 1, -2, 0, 0, 0, 0>, т.к. ортов 7. Я это к тому, что для ситуации, когда полезно указывать скалярные параметры типов явно, лучше написать соответствующее расширение — у моей библиотеки цели другие.
    Re[10]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 16.04.06 19:37
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Да, я понимаю, что можно. Вопрос в другом. Если написать что-то вроде

    A>"auto_type v = x * y", то v будет иметь тип x * y. А если написать "volume_t v = x * y", то всё очень замечательно, до тех пор пока слева у тебя базовые типы, а если нет?

    А если нет, то всё тоже замечательно сработает:

    def v = Si.Volume(Si.Velocity(30) * Si.Time(20) * 100 cm)

    Ты бы хоть попробовал, всё-таки, чтобы больше говорить по существу.

    A> В Nemerle есть шаблоны параметризуемые не типами?

    A>
    A>template <int length, int mass, int time>
    A>class physical_value
    A>{
    A>}
    A>

    A>Бывает?

    Ты, как и vdimas когда-то
    Автор: vdimas
    Дата: 29.03.06
    , всё не можешь понять, что я на Nemerle решил точно ту же задачу, но без скалярных параметров шаблонов, и что скалярные параметры шаблонов для решения этой задачи совсем не нужны. vdimas-а я смог переубедить
    Автор: vdimas
    Дата: 14.04.06
    . Надеюсь, что смогу и тебя
    Re[6]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 16.04.06 19:37
    Оценка: 36 (1) +1
    Здравствуйте, adontz, Вы писали:

    A>Нет-нет, не туфта. Конечно же нет. Я ведь не говорю, что Nemerle это плохо, а спрашиваю сможет ли его осилить среднестатистический программист? А ведь это необходимое условие широкого использования языка.


    WolfHound в принципе уже ответил
    Автор: WolfHound
    Дата: 16.04.06
    , что на Nemerle можно писать точно как на C#.

    Вот насчёт функциональных возможностей и макросов, честно говоря, не знаю. До сих пор языки вроде Ocaml и Schema не пользовались особой популярностью; с другой стороны, создателям Nemerle удалось красиво интегрировать все эти фичи вместе, да ещё и оформить всё это как .NET-язык (что тоже дорогого стоит).

    В общем, как минимум пользоваться Nemerle как C# можно, а потом людям, может, самим надоест забивать гвозди микроскопом и они начнут пользовать нетипичные для C# возможности языка. А может, Nemerle просто тихо пройдёт мимо ("зачем нам клон C#?"), оставшись незамеченным (мне бы очень этого не хотелось, но я не исключаю такой возможности). Who knows
    Re[9]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 16.04.06 19:47
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Ладно отвечу. "kg" для языка — это оператор. Так что как ты его напишешь "10 kg" или "10kg" роли играть не должно (я прав? это я к автору библиотеки обращаюсь).


    Естественно — оно роли и не играет. Можно спокойно писать 10kg (только что проверил даже — компилится).

    VD>А вот "кг" конечно не пройдет. Но не потому, что есть фзические окраничения, а просто потому, что "кг" не описан. Опиши его и будет прохдить и он.


    +1

    A>>Мне подход с явным указанием типов, а не суффиксов, нравиться больше.


    VD>Используй его. Ты единственный кому это нравится, но это не проблема. Первая версия именно так и делала. Но нашелся орел вроде тебя кому показалось, что "10 kg" более понятно.


    На самом деле, можно и сейчас писать Si.Mass(10), как и раньше, конечно.

    Вообще идею с "физическими литералами" придумал я но вот очень-очень её захотел видеть vdimas.
    Re[11]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 20:21
    Оценка: 7 (1)
    Здравствуйте, Oyster, Вы писали:

    O>А если нет, то всё тоже замечательно сработает:

    O>
    O>def v = Si.Volume(Si.Velocity(30) * Si.Time(20) * 100 cm)
    O>


    Кстаити, прведи сообщение компилятора в случае ошибки типов, плиз.

    O>Ты, как и vdimas когда-то
    Автор: vdimas
    Дата: 29.03.06
    , всё не можешь понять, что я на Nemerle решил точно ту же задачу, но без скалярных параметров шаблонов, и что скалярные параметры шаблонов для решения этой задачи совсем не нужны. vdimas-а я смог переубедить
    Автор: vdimas
    Дата: 14.04.06
    . Надеюсь, что смогу и тебя


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

    А вот чтобы объяснить остальным было бы неплохо написать статейку которая:
    1. Просто и доходчиво описывала бы суть проблемы.
    2. Описывало принцип решения задачи на С++.
    3. Описывала бы логику и принцыпы решения задачи на Немерле.
    4. Демонстрировала бы положительные моменты решения на Немерле.

    Это было бы даже полезнее чем сам код, так как понять саму задачу могут только очень немногие посвященные, в основном С++-ники. А для большинство это не более чем крутая но совершенно непонятная пенисометрия между С++-никами и Немерлистами.

    С удовольствием помгу с языком и формулировками, но писать тебе, так как я скорее принадлежу той массе для которого все это далекий спор о высоких материях разбираться в которых сложно и неохота.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 20:21
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>На самом деле, можно и сейчас писать Si.Mass(10), как и раньше, конечно.


    Думаю, что Адонц просто не понимает, что kg — это такой забавный оператор явного приведения типов, или даже фунция "int -> Si.Mass".

    O>Вообще идею с "физическими литералами" придумал я но вот очень-очень её захотел видеть vdimas.


    Думаю, что это та мысль которая что называется витает в воздухе и она приходит в голову всем людям с развитым воображеним и чувством гормонии.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 20:21
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>В общем, опять началась охота на ведьм


    Точно!

    O>Советую снова — попробуй Nemerle и мою библиотеку в действии, прежде чем критиковать их.


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

    Думаю, это простило бы ситуацию и убрало бы барьер восприятия. Ведь попробовав на практике многие вопросы бы отпали сами собой.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 21:37
    Оценка: +1
    Здравствуйте, WolfHound, Вы писали:

    WH>Нет. И не надо. Учи матчасть. Посмотри как это реализовано и не говори глупостей.


    С таким уровнем аргументации далеко не уедешь. Nemrle не распространён, у него даже официальной документации нет. Если знаешь что-то важное — говори, а RTFM неуместен.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 21:41
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>
    VD>def x : int = любое_выражение;
    VD>

    VD>"x" будет иметь тип int независимо от того, что за тип выводится из "любое_выражение". Если тип несовместим или требует рантайм-приведения, то компилятор просто откажется компилитовать код.
    VD>Надесь, на этом данная дискусиия будет закрыта.

    Влад, это понятно, это ты вопроса не понял. Вопрос такой
    def acceleration_derivative_by_distance : ?что тут писать? = (acceleration2 - acceleration1) / (coord2 - coord1)
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 21:47
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    A>> А ведь это более естественно Да и где гарантия, что никто не забудет это самое k. Ошибка в 1000 раз на пустом месте.

    VD>Нда. Тяжолый случай. Рассуждения без малейшено понимания о предмете рассуждения. Еше раж. "10" и "10 kg" разные типы данных для языка. "10" — это int, а "10 kg" это 10 килограм, то есть другой тип данных. Так как нет неявного приведения, то они несовместимы и компилятор выдаст ошибку.

    Влад, ты невнимательно читаешь. Ещё раз — "Да и где гарантия, что никто не забудет это самое k"?
    То есть вместо 10 kg мы получим 10 g. Между ними как раз очень даже есть преобразование.

    A>>Мне подход с явным указанием типов, а не суффиксов, нравиться больше.

    VD>Используй его. Ты единственный кому это нравится, но это не проблема.

    Влад, давай не будем говорить за всех, ОК?

    A>>И, учитывая, что Nemerle язык новый, а Си++ старый, я бы это рассматривал как большой плюс Си++. Хотя конечно на Nemerle всё удобнее.

    VD>Логика изумительная. Нет слов! Тогда давай PL1 рассматр как идеальный язык. Оно ведь куда старше.

    Влад, ты читаешь, то что я пишу? Я сказал — достоинством Си++ является то, что на нём можно реализовать довольно новые идеи, пусть и не очень удобно. Причём тут идеальный язык?

    VD>Короче, мне все меньше и меньеш интересен этот разговр.


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

    VD>"value_t<1, 1, -2>"- это бред сивой кобылы. Эта строчка только в очень багатом воображении может оказаться осмысленной. Между тем имея полноценный ДСЛ описывающий взамиоотношения типов ты в силах описать любую комбинацию очень кратко и понятно.


    Нет value_t<1, 1, -2> это величина с разверностью
    м*кг
    -----
    с^2
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[7]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 21:56
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>В общем, я просто не хочу вести разговор с теми кто даже не пробовл но хит. Попробуй, выяви проблемы, тогда их и обсудим. А пока это только твои фобии.


    А ты пробовал? Я просил привести пример, но так и не увидел его. Почему мои фобии менее убедительны, нежели твой патриотизм?

    VD>
    VD>regexp match (str)
    VD>{ | "a+.*" => printf("a\n");
    VD>  | @"(?<num : int>\d+)-\w+" => printf("%d\n", num + 3);
    VD>  | "(?<name>(Ala|Kasia))? ma kota" =>
    VD>     match(name)
    VD>     { | Some (n) => printf("%s\n", n)
    VD>       | None => printf("noname?\n")
    VD>     }
    VD>  | _ => printf("default\n");
    VD>}
    VD>

    VD>Думаю, что ты поймешь ее даже незня, что такое match и т.п. Изменение каких приоритетов может нарушить логику этой конструкции?

    ОК, очень просто. Насколько я понял тут выполняется одно из нескольких условий (| я воспринял как оператор OR, Если это не так — интуитивная понятность отметается). Пусть str подходит под несколько (why собственно not?). Просто поменяй условия местами — вот и всё.

    VD>Если в ДСЛ появляются приоритеты — это это уже путь в неверном направлении. ДЧЛ должен максимально декларативно описывать суть задачи, а макросы превращать это описание в реальный код отрабатывающий ее решение.


    Декларативные языки удобнее в использовании, но вот создавать их эффективные реализации труднее. Не говоря уже о хоть каких-то реализациях.

    VD>Так что ошибиться в описании ДСЛ-я куад сложенее чем при проектировании библиотеки.


    Это ты как великий теоритик говоришь или я всё таки увижу созданный тобой и используемый где либо кроме лаборатории DSL? Подмножества универсальных языков типа XML конфига или кода Designer.cs не в счёт.

    VD>Нда. И где я уже видил эту аргументацию? А, у АВК. Когда аргументы по делу кончаются, то почему-то сразу начинаются "аргументы" вроде "Это что серебрянная пуля? Их не быват... Не пудрите мне мозги...".


    Ну так покажи пример. Где он? Нету, одни обещания всех шапками закидать. Я бы и рад поверить тебе, но моим аргументам ты можешь только противопоставить свои, а где факты? А факты удачного использования куда-то спешно удалились.

    VD>Это следующий шаг в развитии индустрии программировния. Сама по себе концпция ДСЛ-ей не избавит от решения задач. Но во многих случаях она позволит решать задачи более просто, а значит решать более сложные задачи и решать их быстрее. Как ООП, ФП и другие парадигмы эта позволяет увеличить сложность решаемых задач впихнув их в довольно скудные возможности мозга человека.


    Заканчивал курсы маркетологов? Почём брали за месяц?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 21:58
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>
    O>def a : Si.Area = 10 m * 15 m
    O>

    O>Приведёт к ошибке во время компиляции, т.к. площадь — это не объём. Насколько я понимаю, это именно то, что тебе нужно?

    В коде у тебя что-то не то, но понял ты правильно.
    А теперь внимание — я хочу тип производной скорости по расстоянию.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[3]: Языково-ориентированное программирование: следующая п
    От: Lloyd Россия  
    Дата: 16.04.06 22:01
    Оценка: +2 :))) :)
    Здравствуйте, VladD2, Вы писали:

    VD>КОП и МП могут прекрасно существовать вместе и дополнять друг-друга. КОП больше ориентируется на рантайм, а МП на реализацию. Но они имеют общую задачу. Обе парадигмы призваны упростатить разработку сложных систем путем выделения в программах отдельных частей которыми можно оперировать как высокоуровневыми сущьностями.


    Выделенное улыбнуло.
    Re[9]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 22:01
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Кстати, ты всерьёз считаешь, что value_t<1, 1, -2> удобнее хоть в каком-то случае?


    Конечно нет. Конечно же для всех базовых величин надо сделать typedef. НО! Если я захочу производную размерность, причём не важно какую, она у меня есть. Причём именно в том виде в котором я её записываю — единицы измерения со степенями, ибо названия нет.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[11]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 22:03
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>А если нет, то всё тоже замечательно сработает:

    O>
    O>def v = Si.Volume(Si.Velocity(30) * Si.Time(20) * 100 cm)
    O>

    O>Ты бы хоть попробовал, всё-таки, чтобы больше говорить по существу.

    А для размерности м^5*кг^3*с^(-7) что писать?

    O>Ты, как и vdimas когда-то
    Автор: vdimas
    Дата: 29.03.06
    , всё не можешь понять, что я на Nemerle решил точно ту же задачу, но без скалярных параметров шаблонов, и что скалярные параметры шаблонов для решения этой задачи совсем не нужны. vdimas-а я смог переубедить
    Автор: vdimas
    Дата: 14.04.06
    . Надеюсь, что смогу и тебя


    Мне нужен м^5*кг^3*с^(-7), убеждай
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 22:06
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Можешь создать некий пакет чтобы его можно было загрузить из Интернета или взять с диска и одним запуском батника попробовать? Ну, и инструкцию к нему, что можно менять...

    VD>Думаю, это простило бы ситуацию и убрало бы барьер восприятия. Ведь попробовав на практике многие вопросы бы отпали сами собой.

    Влад, давай хоть что-то конструктивное сделаем, может интегрировать Nemerle в студию? Чтобы был нормальный проект типа file\new\project\nemerle console application? Дело-то не хитрое, ну на недельку от силы. Ниже этого барьер не опустить. Но с тебя иконки
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 22:10
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Влад, ты невнимательно читаешь. Ещё раз — "Да и где гарантия, что никто не забудет это самое k"?


    Гарантия может быть только одна. Разрешено ли неявное преобразование между килограммами и граммами. Если боишся ошибиться, не вводи преобрзование.

    Надо все же понимать, что имешь дело с полноценной настраиваемой системой типов. И что ты можешь настроить ее как тебе нужно.

    A>То есть вместо 10 kg мы получим 10 g. Между ними как раз очень даже есть преобразование.


    Тебу тут уже радом объясняли, что с тем же успехом ты можешь перепутать "+" и "*". Это докапывание не по существу.

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

    В общем, это не проблема языка.

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

    A>>>Мне подход с явным указанием типов, а не суффиксов, нравиться больше.

    VD>>Используй его. Ты единственный кому это нравится, но это не проблема.

    A>Влад, давай не будем говорить за всех, ОК?


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

    A>>>И, учитывая, что Nemerle язык новый, а Си++ старый, я бы это рассматривал как большой плюс Си++. Хотя конечно на Nemerle всё удобнее.

    VD>>Логика изумительная. Нет слов! Тогда давай PL1 рассматр как идеальный язык. Оно ведь куда старше.

    A>Влад, ты читаешь, то что я пишу? Я сказал — достоинством Си++ является то, что на нём можно реализовать довольно новые идеи, пусть и не очень удобно. Причём тут идеальный язык?


    Я не вижу в твоих словах рассуждений о реализации. Я вижу утверждение "С++ старый и это плюс".

    VD>>"value_t<1, 1, -2>"- это бред сивой кобылы. Эта строчка только в очень багатом воображении может оказаться осмысленной. Между тем имея полноценный ДСЛ описывающий взамиоотношения типов ты в силах описать любую комбинацию очень кратко и понятно.


    A>Нет value_t<1, 1, -2> это величина с разверностью

    A>м*кг
    A>-----
    A>с^2

    Это домыслы. На самом деле это какие-то цифирьки дающие весма неинтуитивные побочные эффекты.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 22:16
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    A>>Влад, ты читаешь, то что я пишу? Я сказал — достоинством Си++ является то, что на нём можно реализовать довольно новые идеи, пусть и не очень удобно. Причём тут идеальный язык?


    VD>Я не вижу в твоих словах рассуждений о реализации. Я вижу утверждение "С++ старый и это плюс".


    Влад, в первом классе есть урок — чтение. Не прогуливал?
    "С++ это старый язык, позволяющий, пусть и не оптимально, реализовывать новые идеи и это плюс".

    VD>>>"value_t<1, 1, -2>"- это бред сивой кобылы. Эта строчка только в очень багатом воображении может оказаться осмысленной. Между тем имея полноценный ДСЛ описывающий взамиоотношения типов ты в силах описать любую комбинацию очень кратко и понятно.


    A>>Нет value_t<1, 1, -2> это величина с разверностью

    A>>м*кг
    A>>-----
    A>>с^2

    VD>Это домыслы.

    Нажимаем Ctrl+Space.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[11]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 23:30
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Влад, давай хоть что-то конструктивное сделаем, может интегрировать Nemerle в студию? Чтобы был нормальный проект типа file\new\project\nemerle console application?


    Да, на уровне редактирование, подсветка, отладка. К сожалению комлита нет. А отладка кривовата. Но хоть что-то.
    Ссылки можно найти здесь:
    Re: Микро-аддин для VS 2005
    Автор: Oyster
    Дата: 06.03.06

    Интеграция с IDE
    Автор: VladD2
    Дата: 10.03.06


    A> Дело-то не хитрое, ну на недельку от силы. Ниже этого барьер не опустить. Но с тебя иконки


    Какие иконци? С Немерлей уже идут иконки.

    Если интересен язык, то могу на этих условиях прислать предварительные версии статей.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.04.06 23:30
    Оценка: 23 (3)
    Здравствуйте, adontz, Вы писали:

    A>А ты пробовал?


    Естественно, да.

    A> Я просил привести пример, но так и не увидел его.


    Пример чего? ДСЛ-я? Я тебе их несколько привел.

    A>ОК, очень просто. Насколько я понял тут выполняется одно из нескольких условий (| я воспринял как оператор OR, Если это не так — интуитивная понятность отметается).


    Почти. Смысл очень похож. Хотя я бы сказал, что "|" используется как некая префиксная запятая.

    A> Пусть str подходит под несколько (why собственно not?). Просто поменяй условия местами — вот и всё.


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

    A>Декларативные языки удобнее в использовании, но вот создавать их эффективные реализации труднее. Не говоря уже о хоть каких-то реализациях.


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

    VD>>Так что ошибиться в описании ДСЛ-я куад сложенее чем при проектировании библиотеки.


    A>Это ты как великий теоритик говоришь или я всё таки увижу созданный тобой и используемый где либо кроме лаборатории DSL? Подмножества универсальных языков типа XML конфига или кода Designer.cs не в счёт.


    Хм. А почему собственно не в счет? То что я создавал на Немерле пока что пробы пера. Хотя одна из них мне самоу понравилась. Я написал забавный макрос автоматизирующий перевод программ на другие языки. В программе ты используешь строки вида %%"ля-ля-ля $(выражение) тополя", а макрос при компиляции сам их разбирает и генерирует файл заготовку для перевода (в формате ХМЛ). Далее когда программа запускается она читает этот файл и формирует строки. При чтении она проверяет не содержит ли файл строк для текущего языка процесса и если содержит выбирает его. Так что можно изменить этот файл введя текс на других языках и получить переведенную программу. Сама же программа при этом пишется как будто ее не требуется переводить. Более того любая имеющаяса Немерловая программа может быть простой контекстной заменой превращена в переводимую на другие языки.

    Вот как выглядит программа с использованием этого макроса:
    using Localization;
    
    [assembly: LocalizationFile("Strings.xml")]
    
    using System.Console;
    
    def nums = array[1, 2, 3];
    def x = 5;
    
    WriteLine(%%"a=$(nums[1]) x = $x");
    
    def F(y : int){ y * y }
    WriteLine(%%"F(3)=$(F(3))");

    Вот что формируется в результате компиляции этой программы файл перевода:
    <strings>
        <ID_0>
            <en-US>a={0} x = {1}</en-US>
        </ID_0>
        <ID_1>
            <en-US>F(3)={0}</en-US>
        </ID_1>
    </strings>

    его можно изменить следующим образом:
    <strings>
        <ID_0>
            <en-US>a={0} x = {1}</en-US>
        </ID_0>
        <ID_1>
            <en-US>F(3)={0}</en-US>
        <ru-RU>Функция F(3) вернуло значение {0}.</ru-RU>
        </ID_1>
    </strings>

    а вот как выглядит макрос:
    using System;
    using System.Console;
    using Nemerle.Compiler;
    using Nemerle.Collections;
    using Nemerle.Macros;
    using PT = Nemerle.Compiler.Parsetree;
    using System.Text;
    using System.IO;
    using System.Xml.XPath;
    
    namespace Localization
    {
      
      // Meta-attribut which call when assembly loading.
      // It's receive name of localization file nale.
      // The LocalizationString macro write into this file 
      // localization information. Папа мама я.
      [Nemerle.MacroUsage(Nemerle.MacroPhase.BeforeInheritance,
        Nemerle.MacroTargets.Assembly)
      ]
      macro LocalizationFile(fileName : string)
      {
        Helper._fileName = fileName;
        _ = Helper._builder.AppendLine("<strings>");
        // _holder save _builder content to a file when ncc closing.
        Helper._holder = Helper.Holder();
      }
    
      macro LocalizationString(str : string)
      syntax ("%%", str)
      {
        def exprs = Helper.make_splice_distribution (
          str, ImplicitCTX().Env);
    
        // Формируем строку формата "str" и список аргуменов (выражений в них подсавляемых).
        def (str, args, _) = exprs.FoldRight(("", [], 0), fun(expr, accumulator)
        {
          // Выделяем из кортежа отдельные значения
          // str - формируемая строка форамата.
          def (str, args, i) = accumulator;
          def x = expr.ToString(); // Преобразуем текущее выражение в строку.
          // Функция Unquot(s) убирает обрамляющие ковычки из строки.
          def Unquot(s) { s.Substring(1).Substring(0, s.Length - 2) }
          // AddTwiceBraces(s) удваиват знаки "{" и "}".
          def AddTwiceBraces(s) { s.Replace("{", "{{").Replace("}", "}}") }
          
          if (x.Length > 0)
          {
            // Если стока начинается с ", то это просто подстрока которую нужно 
            // обработать и добавить в строку формата.
            if (x[0] == '"')
              (str + AddTwiceBraces(Unquot(x)), args, i)
            // иначе это "встроеное" подвыражение выделенное из строки.
            // Для каждого такого подвыражения нужно добавить с форматную строку
            // тег вида {x} где x - это номер подвыражения, а так же добавить выражение 
            // в список выражений которые в посделствии будут формировать параметры.
            else
              (str + "{" + i.ToString() + "}", expr :: args, i + 1)
          }
          else // Если строка пуста, то ничего не делаем.
            accumulator
        });
    
        // Добавляем в начала списока параметров парамер содержащий строку формата.
        // сам список параметров при этом разворачиваем, так как формировался он в обратном порядке.
        def args = <[ $(Helper.GenerateId() : string) ]> :: args.Reverse();
    
        // Добавляем тег в файл локализации.
        Helper.AddString(str);
        
        // Формируем выражение форматированного вывода и возвращаем его как результат работы макроса.
        // Этот код заместит вызов макроса. Консрукция ( .. $args) сформирует кортэж с параметрами.
        // В Nemerle кортежи и списки параметров функций равнозначны. Так что можно считать, что 
        // сформирован список парамтеров!
        <[ Localiser._instace.Format( .. $args) ]>
      }
    
      internal module Helper
      {
        public mutable _cointer : int = 0;
        public mutable _fileName : string;
        public _builder : StringBuilder = StringBuilder();
        public  mutable _holder : Holder;
        
        public GenerateId() : string
        {
          "ID_" + _cointer.ToString()
        }
        
        public AddString(str : string) : void
        {
          _ = _builder.AppendFormat("    <ID_{0}>", _cointer);
          _ = _builder.AppendLine();
          _ = _builder.AppendLine(  "        <en-US>" + str + "</en-US>");
          _ = _builder.AppendFormat("    </ID_{0}>", _cointer);
          _cointer++;
          _ = _builder.AppendLine();
        }
    
        // Holder save the _builder content to file (with name contain in _fileName) 
        // when ncc closing.
        [Record]
        internal class Holder
        {
          protected override Finalize() : void
          {
            _ = Helper._builder.AppendLine("</strings>");
            File.WriteAllText(Helper._fileName, Helper._builder.ToString());
          }
        }
        
          /** for $(..) expressions:
            - first evaluate expressions
            - store intermediate results in variables
            - return list of evaluators and reference variables in reverse order
         */
        public make_splice_distribution (str : string, _env : GlobalEnv) 
          : list [PT.PExpr]
        {
          mutable seen_non_alnum = false;
          
          def find_end (balance, idx) {
            when (idx >= str.Length)
              Message.FatalError ("runaway $(...) in format string");
    
            def ch = str[idx];
            seen_non_alnum = seen_non_alnum || !(System.Char.IsLetterOrDigit (ch) || ch == '_');
            match (ch) {
              | ')' when balance == 1 => idx
              | ')' => find_end (balance - 1, idx + 1)
              | '(' => find_end (balance + 1, idx + 1)
              | _ => find_end (balance, idx + 1)
            }
          }
    
          def find_end_normal (idx) {
            if (idx >= str.Length) idx
            else
              match (str[idx]) {
                | '_' 
                | ch when System.Char.IsLetterOrDigit (ch) => find_end_normal (idx + 1)
                | _ => idx
              }
          }
    
          def loop (res, idx) {
            if (idx < 0 || idx >= str.Length)
              res
            else if (str[idx] == '$') {
              when (idx + 1 >= str.Length)
                Message.FatalError ("lone `$' at the end of the format string");
              if (str[idx + 1] == '(') {
                def end = find_end (1, idx + 2);
                def expr = str.Substring (idx + 2, end - idx - 2);
                def expr =
                  if (expr == "" || expr == "_" || 
                      seen_non_alnum || 
                      System.Char.IsDigit (expr [0])) {
                    MacroColorizer.PushUseSiteColor ();
                    def expr = MainParser.ParseExpr (_env, expr);
                    MacroColorizer.PopColor ();
                    expr
                  } else if (expr == "this")
                    <[ this ]>
                  else
                    <[ $(expr : usesite) ]>;
                loop (expr :: res, end + 1)
              }
              else if (str[idx + 1] == '$')
                loop (<[$("$" : string)]> :: res, idx + 2)
              else {
                def end = find_end_normal (idx + 1);
                def variable_name = str.Substring (idx + 1, end - idx - 1);
                
                if (variable_name == "") {
                  Message.Warning ("expected variable name or expression enclosed with (..) after $ in splice string");
                  loop (<[$("$" : string)]> :: res, idx + 1)
                }
                else {
                  def expr =
                    if (variable_name == "this") <[ this ]>
                    else <[ $(variable_name : usesite) ]>;
                  loop (expr :: res, end)
                }
              }
            } else {
              def next_idx = str.IndexOf ('$', idx);
              def next_str =
                if (next_idx == -1) str.Substring (idx)
                else str.Substring (idx, next_idx - idx);
              loop (<[ $(next_str : string) ]> :: res, next_idx)
            }
          }
    
          loop ([], 0)
        } 
      }
    
      public class Localiser
      {
        public static _instace : Localiser = Localiser();
        
        public this()
        {
          def lang = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
          def defLang = "en-US";
          
          def doc = XPathDocument("Strings.xml");
          def iter = doc.CreateNavigator().Select("/strings/*");
    
          foreach (vlue :> XPathNavigator in iter)
          {
            mutable langIter = vlue.Select(lang);
            
            when (!langIter.MoveNext()) // Нет строк для этого языка!
            {
              langIter = vlue.Select(defLang);
              when (!langIter.MoveNext())
                throw ApplicationException("No string for ID={0} found.");
            }
    
            _msgMap.Add(vlue.Name, langIter.Current.Value);
          }
        }
    
        private _msgMap : Hashtable.[string, string] = Hashtable.[string, string]();
    
        public Format(msgId : string, params args : array[object]) : string
        {
          string.Format(_msgMap[msgId], args);
        }
      }
    }


    ДСЛ прост как три копйки хотя и позволяет в выражениях использовать любые конструкции Немерла. Контроль выражений осуществляется самим компилятором. А моя забота только грамотно отработать семантику.

    A>Ну так покажи пример. Где он?


    Пример чего? Тебе же дали ссылку на огромый ДСЛ описания физ.велечин. Что тебе еще надо? Что за дурацкая привычка делать вид, что ничего не видешь?

    A> Нету, одни обещания всех шапками закидать. Я бы и рад поверить тебе, но моим аргументам ты можешь только противопоставить свои, а где факты? А факты удачного использования куда-то спешно удалились.


    Есть пустопорожний треп. Но мне кажется он исходит не от меня.

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

    VD>>Это следующий шаг в развитии индустрии программировния. Сама по себе концпция ДСЛ-ей не избавит от решения задач. Но во многих случаях она позволит решать задачи более просто, а значит решать более сложные задачи и решать их быстрее. Как ООП, ФП и другие парадигмы эта позволяет увеличить сложность решаемых задач впихнув их в довольно скудные возможности мозга человека.


    A>Заканчивал курсы маркетологов? Почём брали за месяц?


    Дорого. Тебе не понятуть.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 16.04.06 23:47
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>А зачем менять местами?


    Чтобы добавить номер версии. вообще я просто привёл пример смены приоритетов. придумывать для такой замены смысл я не буду — это всего лишь пример.

    A>>Это ты как великий теоритик говоришь или я всё таки увижу созданный тобой и используемый где либо кроме лаборатории DSL? Подмножества универсальных языков типа XML конфига или кода Designer.cs не в счёт.


    VD>Хм. А почему собственно не в счет?


    Потому что в когда Си++ придумывали никто грабли не проектировал, однако он есть Пока не начнёшь использовать что-то каждый день — недостатков не увидишь.

    VD>Вот как выглядит программа с использованием этого макроса:

    VD>[пример поцокан]

    Вааа наконецто! Уже лучше! Да, признаю, некоторая ощютимая польза от макросов Nemеrle есть при сохранении условия простоты использования.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[12]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 00:09
    Оценка: 9 (1) -1
    Здравствуйте, VladD2, Вы писали:

    Вот за последлнй час сочинил решение на Си++

    //
    //
    // ПИШЕМ СУПЕР ВЕЩЬ!
    //
    //
    #include <Math.h>
    //
    template <
        int length_power, int weight_power, int time_power,
        typename value_type = double,
        int length_coef_numerator = 1, int length_coef_denominator = 1,
        int weight_coef_numerator = 1, int weight_coef_denominator = 1,
        int time_coef_numerator = 1, int time_coef_denominator = 1>
    class physical_value_t
    {
        private:
            value_type _value;
        private:
            static const value_type length_coefficient;
            static const value_type weight_coefficient;
            static const value_type time_coefficient;
        private:
            void assign(const physical_value_t & value)
            {
                _value = value._value;
            }
            void assign(const value_type & value)
            {
                _value = value;
            }
            template <
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            void assign(const physical_value_t<length_power, weight_power, time_power, vt, lcn, lcd, wcn, wcd, tcn, tcd> & value)
            {
                _value = value.dangerous_dimensionless() *
                    pow((((value_type)lcn)/((value_type)lcd))/length_coefficient, length_power) *
                    pow((((value_type)wcn)/((value_type)wcd))/weight_coefficient, weight_power) *
                    pow((((value_type)tcn)/((value_type)tcd))/time_coefficient, time_power);
            }
        public:
            physical_value_t() : _value(0)
            {
            }
            physical_value_t(const physical_value_t & value)
            {
                assign(value);
            }
            physical_value_t(const value_type & value)
            {
                assign(value);
            }
            
            template <
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t(const physical_value_t<length_power, weight_power, time_power, vt, lcn, lcd, wcn, wcd, tcn, tcd> & value)
            {
                assign<vt, lcn, lcd, wcn, wcd, tcn, tcd>(value);
            }
    
            physical_value_t & operator = (const physical_value_t & value)
            {
                assign(value);
                return *this;
            }
            physical_value_t & operator = (const value_type & value)
            {
                assign(value);
                return *this;
            }
            
            template <
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t & operator = (const physical_value_t<length_power, weight_power, time_power, vt, lcn, lcd, wcn, wcd, tcn, tcd> & value)
            {
                assign<vt, lcn, lcd, wcn, wcd, tcn, tcd>(value);
                return *this;
            }
    
            value_type dangerous_dimensionless() const
            {
                return _value;
            }
            
            physical_value_t operator + (const physical_value_t & right)
            {
                return physical_value_t (_value + right._value);
            }
            
            physical_value_t operator - (const physical_value_t & right)
            {
                return physical_value_t (_value - right._value);
            }
            
            physical_value_t operator * (const value_type & right)
            {
                return physical_value_t(_value * right);
            }
            
            physical_value_t<
                2*length_power, 2*weight_power, 2*time_power,
                value_type,
                length_coef_numerator*length_coef_numerator, length_coef_denominator*length_coef_denominator,
                weight_coef_numerator*weight_coef_numerator, weight_coef_denominator*weight_coef_denominator,
                time_coef_numerator*time_coef_numerator, time_coef_denominator*time_coef_denominator>
                    operator * (const physical_value_t & right)
            {
                return physical_value_t<
                    2*length_power, 2*weight_power, 2*time_power,
                    value_type,
                    length_coef_numerator*length_coef_numerator, length_coef_denominator*length_coef_denominator,
                    weight_coef_numerator*weight_coef_numerator, weight_coef_denominator*weight_coef_denominator,
                    time_coef_numerator*time_coef_numerator, time_coef_denominator*time_coef_denominator>(
                    _value * right._value);
            }
            
            physical_value_t operator / (const value_type & right)
            {
                return physical_value_t(_value / right);
            }
            
            physical_value_t<
                0, 0, 0,
                value_type,
                1, 1,
                1, 1,
                1, 1>
                    operator / (const physical_value_t & right)
            {
                return physical_value_t<
                    0, 0, 0,
                    value_type,
                    1, 1,
                    1, 1,
                    1, 1>(
                        _value / right._value);
            }
            
            physical_value_t & operator += (const physical_value_t & right)
            {
                _value += right._value;
                return *this;
            }
            
            physical_value_t & operator -= (const physical_value_t & right)
            {
                _value -= right._value;
                return *this;
            }
            
            physical_value_t & operator *= (const value_type & right)
            {
                _value += right;
                return *this;
            }
            
            physical_value_t & operator /= (const value_type & right)
            {
                _value -= right;
                return *this;
            }
            
            template <
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t operator + (const physical_value_t & right)
            {
                return physical_value_t(_value + physical_value_t(right).dangerous_dimensionless());
            }
            
            template <
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t operator - (const physical_value_t & right)
            {
                return physical_value_t(_value - physical_value_t(right).dangerous_dimensionless());
            }
            
            template <
                int lp, int wp, int tp,
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t<
                length_power + lp,
                weight_power + wp,
                time_power + tp,
                value_type,
                length_coef_numerator, length_coef_denominator,
                weight_coef_numerator, weight_coef_denominator,
                time_coef_numerator, time_coef_denominator>
                    operator * (const physical_value_t<lp, wp, tp, vt, lcn, lcd, wcn, wcd, tcn, tcd> & right)
            {
                return physical_value_t<
                    length_power + lp,
                    weight_power + wp,
                    time_power + tp,
                    value_type,
                    length_coef_numerator, length_coef_denominator,
                    weight_coef_numerator, weight_coef_denominator,
                    time_coef_numerator, time_coef_denominator>(
                        _value * right.dangerous_dimensionless() *
                        pow((((value_type)lcn)/((value_type)lcd))/length_coefficient, lp) *
                        pow((((value_type)wcn)/((value_type)wcd))/weight_coefficient, wp) *
                        pow((((value_type)tcn)/((value_type)tcd))/time_coefficient, tp));
            }
            
            template <
                int lp, int wp, int tp,
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t<
                length_power - lp,
                weight_power - wp,
                time_power - tp,
                value_type,
                length_coef_numerator, length_coef_denominator,
                weight_coef_numerator, weight_coef_denominator,
                time_coef_numerator, time_coef_denominator>
                    operator / (const physical_value_t<lp, wp, tp, vt, lcn, lcd, wcn, wcd, tcn, tcd> & right)
            {
                return physical_value_t<
                    length_power - lp,
                    weight_power - wp,
                    time_power - tp,
                    value_type,
                    length_coef_numerator, length_coef_denominator,
                    weight_coef_numerator, weight_coef_denominator,
                    time_coef_numerator, time_coef_denominator>(
                        (_value / right.dangerous_dimensionless()) *
                        pow((((value_type)lcn)/((value_type)lcd))/length_coefficient, -lp) *
                        pow((((value_type)wcn)/((value_type)wcd))/weight_coefficient, -wp) *
                        pow((((value_type)tcn)/((value_type)tcd))/time_coefficient, -tp));
            }
            
            template <
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t & operator += (const physical_value_t & right)
            {
                _value += physical_value_t(right).dangerous_dimensionless();
                return *this;
            }
            
            template <
                typename vt,
                int lcn, int lcd,
                int wcn, int wcd,
                int tcn, int tcd>
            physical_value_t & operator -= (const physical_value_t & right)
            {
                _value -= physical_value_t(right).dangerous_dimensionless();
                return *this;
            }
    };
    //
    template <
        int length_power, int weight_power, int time_power,
        typename value_type,
        int length_coef_numerator, int length_coef_denominator,
        int weight_coef_numerator, int weight_coef_denominator,
        int time_coef_numerator, int time_coef_denominator>
    const value_type physical_value_t<
        length_power, weight_power, time_power,
        value_type,
        length_coef_numerator, length_coef_denominator,
        weight_coef_numerator, weight_coef_denominator,
        time_coef_numerator, time_coef_denominator>::length_coefficient = ((value_type)length_coef_numerator)/((value_type)length_coef_denominator);
    //
    template <
        int length_power, int weight_power, int time_power,
        typename value_type,
        int length_coef_numerator, int length_coef_denominator,
        int weight_coef_numerator, int weight_coef_denominator,
        int time_coef_numerator, int time_coef_denominator>
    const value_type physical_value_t<
        length_power, weight_power, time_power,
        value_type,
        length_coef_numerator, length_coef_denominator,
        weight_coef_numerator, weight_coef_denominator,
        time_coef_numerator, time_coef_denominator>::weight_coefficient = ((value_type)weight_coef_numerator)/((value_type)weight_coef_denominator);
    //
    template <
        int length_power, int weight_power, int time_power,
        typename value_type,
        int length_coef_numerator, int length_coef_denominator,
        int weight_coef_numerator, int weight_coef_denominator,
        int time_coef_numerator, int time_coef_denominator>
    const value_type physical_value_t<
        length_power, weight_power, time_power,
        value_type,
        length_coef_numerator, length_coef_denominator,
        weight_coef_numerator, weight_coef_denominator,
        time_coef_numerator, time_coef_denominator>::time_coefficient = ((value_type)time_coef_numerator)/((value_type)time_coef_denominator);
    //
    //
    // УСЁ, ТЕПЕРЬ ИСПОЛЬЗУЕМ
    //
    //
    typedef physical_value_t<1, 0, 0> phys_meter_t;
    typedef physical_value_t<0, 1, 0> phys_kilogramm_t;
    typedef physical_value_t<0, 0, 1> phys_second_t;
    //
    typedef physical_value_t<1, 0, 0, double, 1, 100, 1, 1, 1, 1> phys_centimeter_t;
    typedef physical_value_t<0, 1, 0, double, 1, 1, 1, 1000, 1, 1> phys_gramm_t;
    typedef physical_value_t<0, 0, 1, double, 1, 1, 1, 1, 60, 1> phys_minute_t;
    typedef physical_value_t<1, 0, -1> phys_mps_t;
    typedef physical_value_t<2, 0, 0> phys_m2_t;
    //
    int _tmain(int argc, _TCHAR* argv[])
    {
        // some tests
        
        phys_meter_t m = 2;
        phys_centimeter_t cm = m;//must be 200
        phys_kilogramm_t kg = 3;
        phys_gramm_t g = kg;// must be 3000
        phys_second_t s = 5;
        phys_minute_t min = s;// must be 0.8333
        phys_mps_t mps = m / s;// must be 0.4
        mps = m / min;//must be still 0.4
        phys_m2_t m2 = m * m;//must be 4
        m2 = m * cm;//must be still 4
        m += cm * 5;// must be 12
        return 0;
    }
    //
    //
    // КОНЧАЕМ ИСПОЛЬЗОВАТЬ - ПЕРЕКУР. И ВООБЩЕ ПОРА ЖРАТЬ.
    //
    //


    Я был бы очень признателен если бы ты привёл объективные недостатки использования данного решения и преимущества использования решения на Nemerle.
    Заметь, что мой код гораздо меньше при приблизительно одинаковой функциональности — контроль размерностей.
    Правда суффиксов нет . Хотя, так на вскидку.
    #define kg() * phys_kilogramm_t(1)

    Наверное не лучший вариант, просто первое, что в голову пришло. Без operator value_type нормально работать вряд ли будет, но я его специально не сделал.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[7]: Языково-ориентированное программирование: следующая п
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 17.04.06 00:11
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    A>>Влад, создаётся впечатление, что DSL это панацея от всех бед. Я не видел ещё ни одного простого и в тоже время эффективного промышленного языка, даже в пределах предметной области.

    A>>А наколеночные поделки не интересны — их и так плодят пачками.

    VD>Нда. И где я уже видил эту аргументацию? А, у АВК. Когда аргументы по делу кончаются, то почему-то сразу начинаются "аргументы" вроде "Это что серебрянная пуля? Их не быват... Не пудрите мне мозги...".

    VD>Это следующий шаг в развитии индустрии программировния. Сама по себе концпция ДСЛ-ей не избавит от решения задач. Но во многих случаях она позволит решать задачи более просто, а значит решать более сложные задачи и решать их быстрее.

    Вот сказать по-нормальному: "создание DSL в ряде случае вопозволяет решить задачу быстрее и проще" и никакой революции не нужно. Все и так давно об этом знали и не кипятились. Иначе бы не было языков управления пакетной обработкой.

    Это сама пе себе "парадигма DSL" появилась благодаря тому, что для разных задач удобны разные языки, а не наоборот. Наоборот была бы каша. Что лишний раз подтверждает собирательный (а не сущностный) характер понятия "парадигма".

    VD>Как ООП, ФП и другие парадигмы эта позволяет увеличить сложность решаемых задач впихнув их в довольно скудные возможности мозга человека.


    О! Ссылка на "парадигму", как некую самостоятельную сущность.

    PS.: В одном ты прав. Действительно, когда мы пишем библиотеку, то по сути, создаём свой DSL.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[12]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 01:29
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Если интересен язык, то могу на этих условиях прислать предварительные версии статей.


    О! Класс! mailto:adontz@caucasus.net в твоём распоряжении. Что-то, а ругать статьи — моё
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[13]: Языково-ориентированное программирование: следующая
    От: Vermicious Knid  
    Дата: 17.04.06 01:30
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Я был бы очень признателен если бы ты привёл объективные недостатки использования данного решения и преимущества использования решения на Nemerle.


    Давай хотя бы сравним вот эту строку из твоего примера:
    typedef physical_value_t<1, 0, 0, double, 1, 100, 1, 1, 1, 1> phys_centimeter_t;

    С этой строкой из решения Oyster'а:
    Length[ cm ] - 1.0 / 100.0,

    Мне понадобилось секунды три чтобы понять, что происходит в первом случае(да, я настолько тупой ). И ~0.0 секунд чтобы разобраться во втором.

    A>Заметь, что мой код гораздо меньше при приблизительно одинаковой функциональности — контроль размерностей.


    Очень смешно. Во-первых не увидел одинаковой функциональности. У тебя предусмотрены только три вида базовых единиц — масса, длина и время. В решении на Nemerle произвольное количество и причем любых(хоть сам придумывай). Обрати внимание в примере описания вот на это:

        basisUnits (Si)
        (
            Mass,
            Length,
            Time,
            Temperature,
            CurrentStrength,
            LightIntensity,
            QuantityOfSubstance
        )

    В решении на Nemerle практически нет хардкодинга и в этом его главное преимущество. Мне честно-говоря даже страшно представить во что превратится твое решение на C++ если скажем понадобится десятка два таких базовых единиц.
    Re[14]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 02:04
    Оценка:
    Здравствуйте, Vermicious Knid, Вы писали:

    typedef physical_value_t<1, 0, 0, double, 1, 100, 1, 1, 1, 1> phys_centimeter_t;
    Length[ cm ] - 1.0 / 100.0,
    Я не понял зачем сравнивать определения типа и оператора? Во-первых, это не имеет отношения к использованию. Во-вторых, мой способ гибче, потому что я не принимаю Си за точку отсчёта и ничто не мешает написать
    typedef physical_value_t<1, 0, 0, double, 100, 1, 1, 1, 1, 1> phys_meter_t;
    typedef physical_value_t<1, 0, 0, double, 1, 1, 1, 1, 1, 1> phys_centimeter_t;
    В-третьих, новые типы определяются настолько редко, что затратами на их определение, тем более конкретизацию шаблона, можно пренебречь.

    VK>Мне понадобилось секунды три чтобы понять, что происходит в первом случае (да, я настолько тупой). И ~0.0 секунд чтобы разобраться во втором.


    А зачем тебе определять что там происходит? Ну сантиметр, ну и ладно. А если очень интересно — Ctrl+Space и смотрим названия параметров шаблона. В принципе это ограничение Си++, что мне пришлось дроби записывать как числитель и знаменатель. Шаблоны не параметризируются не интегральными типами.
    physical_value_t<1, 0, 0, double, 0.01, 1.0, 1.0>
    конечно же лучше, но не бывает.
    Зато в пределах одной системы счисления всё очень даже просто
    typedef physical_value_t<1, 1, -2> phys_newton_t;


    VK>Очень смешно. Во-первых не увидел одинаковой функциональности. У тебя предусмотрены только три вида базовых единиц — масса, длина и время.


    Да хоть 100, просто добавятся однотипные строчки — делов-то. Для решения написанного за час вполне сойдёт. Там по уму ещё надо сделать нетипизированный коэффициент и степени считать не через pow, а шаблонами в момент компиляции. Вообще много чего можно доработать в любом решении, было бы желание.

    VK>В решении на Nemerle практически нет хардкодинга и в этом его главное преимущество. Мне честно-говоря даже страшно представить во что превратится твое решение на C++ если скажем понадобится десятка два таких базовых единиц.


    ОК, это всё правильно, но какое это имеет отношение к использованию решения? Даже если я добавлю поддержку ещё 10 единиц измерения (что на данном этапе займёт 15-30 минут) это не уменьшит и не увеличит проблем использования.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[10]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 04:35
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>В коде у тебя что-то не то, но понял ты правильно.

    A>А теперь внимание — я хочу тип производной скорости по расстоянию.

    Si.Acceleration. Т.е. такой тип задан в моих алиасах. Если ты говоришь о вычислении типа производной, то конкретно этой фичи нет, но её можно добавить. Если ты говоришь об объявлении физической переменной произвольной размерности без её предварительного описания в DSL, то, во-первых, непонятно, на кой это надо, во-вторых, можно добавить её описание в DSL, и, в третьих, всё равно тут синтаксис Nemerle позволяет писать более красивые вещи, чем скалярные параметры шаблонов C++. Например, имхо

    value_t<1, -2, 0> acc = value_t<1, -2, 0>(1);

    Выглядит очень непонятно (попробуй удержи в голове, какой параметр какому орту соответствует) и хуже, чем такой вариант (вполне реализуемый для Nemerle):

    def acc = phys-value[Time / (Length ^ 2)](1)

    Это я к тому, что тут шаблоны C++ не спасают и на Nemerle присутствует лучшее решение — просто надо перестроить свои мозги, сломать себя и понять тот простой факт, что метапрограммирование на Nemerle лучше оного на C++.
    Re[10]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 05:13
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Влад, это понятно, это ты вопроса не понял. Вопрос такой

    A>
    A>def acceleration_derivative_by_distance : ?что тут писать? = (acceleration2 - acceleration1) / (coord2 - coord1)
    A>

    См. Re[10]: Языково-ориентированное программирование: следующая
    Автор: Oyster
    Дата: 17.04.06
    . Кстати, я надеюсь, ты не будешь заявлять, что сделать такое на Nemerle невозможно — если это можно сделать в описании величин, то и в коде, очевидно, тоже.
    Re[12]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 05:13
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>С таким уровнем аргументации далеко не уедешь.


    С таким, как у тебя в сообщениях, тоже. Ты совершенно не осознаёшь возможности, предоставляемые языком, потому что, видимо, не пробовал на нём писать. Кроме того, ты приводишь какие-то глупые аргументы против моей библиотеки, которые говорят о том, что ты не понимаешь, как она работает.

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

    A>Nemrle не распространён, у него даже официальной документации нет.


    У него есть документация — по ней я и учил язык. Или ты говоришь о стандарте? Стандарта, естественно, нет, но мне без него не холодно не жарко. Назови, например, хотя бы парочку компиляторов C++, которые на 100% соответствуют стандарту
    Re[15]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 05:13
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>
    A>typedef physical_value_t<1, 0, 0, double, 1, 100, 1, 1, 1, 1> phys_centimeter_t;
    A>
    A>Length[ cm ] - 1.0 / 100.0,
    A>
    Я не понял зачем сравнивать определения типа и оператора?


    Сравниваются определение типа и определение типа. Жаль, что ты это не понял до этого момента.

    A>Во-первых, это не имеет отношения к использованию.


    Имеет: Re[10]: Языково-ориентированное программирование: следующая
    Автор: Oyster
    Дата: 17.04.06
    .

    A>Во-вторых, мой способ гибче, потому что я не принимаю Си за точку отсчёта и ничто не мешает написать

    A>
    typedef physical_value_t<1, 0, 0, double, 100, 1, 1, 1, 1, 1> phys_meter_t;
    A>typedef physical_value_t<1, 0, 0, double, 1, 1, 1, 1, 1, 1> phys_centimeter_t;

    Где же его большая гибкость, в таком случае?

    A>В-третьих, новые типы определяются настолько редко, что затратами на их определение, тем более конкретизацию шаблона, можно пренебречь.


    Отличная отмазка Особенно хорошо будет поддерживать такой код Кстати, сам автор исходной библиотеки на C++ признаёт, что такое решение коряво
    Автор: CrystaX
    Дата: 06.04.06
    .

    VK>>Мне понадобилось секунды три чтобы понять, что происходит в первом случае (да, я настолько тупой). И ~0.0 секунд чтобы разобраться во втором.


    A>Зато в пределах одной системы счисления всё очень даже просто
    typedef physical_value_t<1, 1, -2> phys_newton_t;

    Да уж, невероятно просто и легко... впрочем, об этом я уже писал. Видимо, у всех поклонников C++ overcomplication считается преимуществом...

    VK>>В решении на Nemerle практически нет хардкодинга и в этом его главное преимущество. Мне честно-говоря даже страшно представить во что превратится твое решение на C++ если скажем понадобится десятка два таких базовых единиц.


    A>ОК, это всё правильно, но какое это имеет отношение к использованию решения? Даже если я добавлю поддержку ещё 10 единиц измерения (что на данном этапе займёт 15-30 минут) это не уменьшит и не увеличит проблем использования.


    Ой ли? В общем, я уже написал всё, что хотел — тебе осталось только внимательно прочитать, не упустив ничего из виду
    Re[12]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 05:13
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Мне нужен м^5*кг^3*с^(-7), убеждай


    Читай это сообщение: Re[10]: Языково-ориентированное программирование: следующая
    Автор: Oyster
    Дата: 17.04.06
    .

    Кстати, у меня возникает простой вопрос — неужели ты сам не мог додуматься до того, что я написал в сообщении? Или ты просто и вправду пытаешься "докопаться" до моего решения (я нахожу такое поведение глупым, поэтому и не могу поверить, что это так)?
    Re[12]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 05:13
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>>>Нет value_t<1, 1, -2> это величина с разверностью

    A>>>м*кг
    A>>>-----
    A>>>с^2

    VD>>Это домыслы.

    A>Нажимаем Ctrl+Space.

    Пять баллов! Я просто в восторге, на самом деле. Ctrl + Space — вот решение всех наших проблем

    А на самом деле, просто надо использовать нормальное решение
    Автор: Oyster
    Дата: 17.04.06
    ...
    Re[10]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 05:13
    Оценка:
    Здравствуйте, adontz, Вы писали:

    O>>Кстати, ты всерьёз считаешь, что value_t<1, 1, -2> удобнее хоть в каком-то случае?


    A>Конечно нет. Конечно же для всех базовых величин надо сделать typedef. НО! Если я захочу производную размерность, причём не важно какую, она у меня есть. Причём именно в том виде в котором я её записываю — единицы измерения со степенями, ибо названия нет.


    Ты так уцепился за этот момент... В общем, привожу ссылку в очередной раз: Re[10]: Языково-ориентированное программирование: следующая
    Автор: Oyster
    Дата: 17.04.06
    . И на всякий случай словами: тем не менее, решение на шаблонах неинтуитивно — в сообщении предложено более (на мой взгляд) красивое решение. И безо всяких Ctrl + Space
    Re[5]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 17.04.06 05:17
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Таких задач масса. Вот тебе ради хохмы пример отличной пенисометрии демонстриующей силу ДСЛ-ей:

    VD>Версия 0.04
    Автор: Oyster
    Дата: 14.04.06

    VD>сравни его с С++-реализацией:
    VD>[Nemerle] Семантический контроль над размерностями
    Автор: Oyster
    Дата: 05.04.06

    VD>это тоже в общем-то ДСЛ, но язык менее выразительный и все проблемы недоДСЛей вылезают очень сильно. Сравни декларацию типов, да и оцени использование физических литералов.

    Да уж... Притопала банда Nemerle-поклонников (практически в полном составе, только IT не был пока замечен) и ввалила бедолаге по первое число. А заодно превратила тему ЯОП в очередную пропаганду Nemerle.

    Мужики, ну чесслово, забабахало. Может хватит поминать Nemerle на каждом шагу? И уж тем более сравнивать его с C++, в котором не было штатных механизмов метапрограммирования (разве что макросов). А все, что было найдено -- это следствие нестандартного использования совершенно не предназначенных для метапрограммирования вещей. Хотите раскрутить Nemerle -- сравнивайте его с C# или с Java, или со Scala. А можно со Smalltalk, Lisp или Ruby. Но, блин, не в теме же про языково-ориентированное программирование.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[6]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 06:41
    Оценка: +1
    Здравствуйте, eao197, Вы писали:

    E>Да уж... Притопала банда Nemerle-поклонников (практически в полном составе, только IT не был пока замечен) и ввалила бедолаге по первое число.


    Nemerle — это наглядный пример статически типизированного языка, позволяющего писать свои DSL-и.

    E>А заодно превратила тему ЯОП в очередную пропаганду Nemerle.


    Тебе тут мерещатся ведьмы?

    E>Мужики, ну чесслово, забабахало. Может хватит поминать Nemerle на каждом шагу? И уж тем более сравнивать его с C++, в котором не было штатных механизмов метапрограммирования (разве что макросов). А все, что было найдено -- это следствие нестандартного использования совершенно не предназначенных для метапрограммирования вещей.


    Так мы и не начали сравнивать. К сожалению, выходит наоборот — оппоненты постоянно говорят про ущербность Nemerle и про то, что многие подобные задачи на C++ решаются лучше. Я, например, не могу в таком случае промолчать. Вот и выходит, что приходится делать такие сравнения.

    А насчёт метапрограммирования и C++ ты совершенно прав — я с тобой полностью согласен тут.

    E>Хотите раскрутить Nemerle -- сравнивайте его с C# или с Java,


    Так тоже сравниваем с C#, просто не все это замечают. Скоро даже статья выйдет — там в основном с C# и идёт сравнение.

    E>или со Scala.


    Scala я не знаю, так что тут скромно промолчу

    E>А можно со Smalltalk, Lisp или Ruby.


    По-моему, с Lisp уже сравнивали. Сошлись на том, что наличие синтаксиса, гигиена в макросах (которую, впрочем, можно явно нарушить) и квази-цитирование есть хорошо.

    Про Ruby и его подход к метапрограммированию (основанный на интерпретации и динамической типизации) по-моему тоже был разговор, и как раз с тобой

    Smalltalk, опять же, не знаю...

    E>Но, блин, не в теме же про языково-ориентированное программирование.


    В этой теме зашёл разговор про неприменимость DSL. Nemerle был приведён как пример языка, на котором DSL-и пишутся легко, да ещё и с контролем на этапе компиляции. Почему нет?


    PS: И не надо искать фанатизма в наших постах — его там нет Зато у них есть аргументация и вполне определённая цель, которой я в этом сообщении не вижу (если, конечно, целью не является зафукать Nemerle в очередной раз ). Никто не мешает тебе, например, смотреть на DSL через призму Ruby — почему же нам нельзя смотреть на них через стёклышко Nemerle?
    Re[7]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 17.04.06 07:04
    Оценка: +1
    Здравствуйте, Oyster, Вы писали:

    E>>А заодно превратила тему ЯОП в очередную пропаганду Nemerle.


    O> Тебе тут мерещатся ведьмы?


    При чем здесь ведьмы?

    Просто оскомину набило очередное обсасывание применимости Nemerle для метапрограммирования.

    Имхо, в этой теме было бы более полезно и интересно обсуждать такие моменты, как:
    — определениее ситуации, в которой DSL был бы более выгоден, чем API, кодогенерация или разделение приложения на несколько слоев/процессов;
    — оценка качества DSL (т.е., насколько он будет удобен в использовании, сопровождении, расширении, совместном использовании с другими DSL);
    — вопросы о совместимости различных DSL в одном приложении/модуле;
    — что-нибудь еще.

    Ну и не нужно забывать, что речь перешла на обсуждение internal DSL, т.е. создание собственного расширения существующего языка. В этом подходе DSL действительно не сильно отличается от еще одного API (а в Ruby таковым и является, т.к. все эти Ruby-новые фишки являются всего лишь вызовами методов объектов без разширения/изменения синтаксиса языка).

    Однако, существует еще понятие external DSL. Про которые (точнее про инструмент для создания которых) шла речь в обсуждаемой здесь статье. И уж к этой разновидности DSL ваше очередное красноречивое доказывание достоинств Nemerle просто не в тему. Уж извини, но если кто-то сомневается в возможностях Nemerle -- пригласите его в соответствующую тему или создайте отдельную. А в очередной раз читать про макросы Nemerle в теме, которая не имеет к этому непосредственного отношения, лично мне скучно.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[6]: Языково-ориентированное программирование: следующая п
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 17.04.06 07:32
    Оценка:
    Здравствуйте, eao197, Вы писали:

    VD>>это тоже в общем-то ДСЛ, но язык менее выразительный и все проблемы недоДСЛей вылезают очень сильно. Сравни декларацию типов, да и оцени использование физических литералов.

    E>Да уж... Притопала банда Nemerle-поклонников (практически в полном составе, только IT не был пока замечен) и ввалила бедолаге по первое число.

    На самом деле, это ещё совсем не понятно — кто кому за что и сколько. Но до боли напоминает дискуссии с AVK, IT и VladD2 3-х летней, кажется, давности. Что примечательно, тогда тоже был C++ vs., правда, C#.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[2]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 17.04.06 07:45
    Оценка: 49 (4)
    Здравствуйте, adontz, Вы писали:

    A>Это конечно очень замечательно брать существующие DSL'и придумывать новые и проч. ит проч., но чрезмерное использование DSL порождает больше проблем чем, пользы. В том числе

    A>

      A>
    1. Надёжность
      A>
    2. Языки
      A>
    3. Диалекты
      A>
    4. Совместимость
      A>
    5. Взаимозаменяемость, обучение
      A>
    6. Поддержка
      A>

    A>В целом к введению в проект новых языков надо относиться очень осторожно. Не надо уподобляться ООН, где большая часть сотрудников это армия переводчиков, которая что-то постоянно синхронно и асинхронно переводит, а большая часть бюджета — их зарплаты.


    A>Должны быть очень серьёзные причины чтобы заставлять людей учить новый язык (я думаю изучение языка программирования по сложности сопоставимо с человеческим языком)...


    Все это так и все эти вопросы действительно актуальны. Но, нужно понимать, что DSL-ям не один день от роду. И что эти вопросы уже кем-то когда-то поднимались.

    Например: The Art of The Unix Programming: Chapter 8. Minilanguages, в особенности Designing Minilanguages. Замечательная цитата из этой главы:

    Therefore, it will often be the case that your only defense against designing a bad minilanguage is knowing how to design a good one. This need not be a huge step or involve knowing a lot of formal language theory; with modern tools, learning a few relatively simple techniques and bearing good examples in mind as you design should be sufficient.


    А так же может быть работа, на которую ссылается Реймонд: Notable Design Patterns for Domain-Specific Languages в которой приводится классификация различных паттернов создания DSL.



    Кстати, может быть интересно, что C++ и Eiffel могут рассматриваться всего лишь как DSL
    Ведь до сих пор на некоторых платформах C++ реализован через cfront и из C++кода генерируется C-код.
    А из трех существующих трансляторов Eiffel два (EiffelStudio и SmartEiffel) не генерируют нативного кода, а транслируют Eiffel в C-код (так же возможна трансляция либо в MSIL (EiffelStudio), либо в Java byte code (SmartEiffel)).


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[8]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 09:50
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Просто оскомину набило очередное обсасывание применимости Nemerle для метапрограммирования.


    Это всё понятно. Но раз уж тему Nemerle подняли, то мне ничего не оставалось, как отвечать

    Да и те, другие, вопросы, тоже обсуждаются. Разговор ведь пошёл о Nemerle потому, что появилась идея, что всё это нагромождение из тулзов, предложенное товарищем из JetBrains, возможно, не нужно, а достаточно языка, который позволяет посать обработчики любых DSL на себе.

    E>Ну и не нужно забывать, что речь перешла на обсуждение internal DSL, т.е. создание собственного расширения существующего языка.


    ...

    E>Однако, существует еще понятие external DSL. Про которые (точнее про инструмент для создания которых) шла речь в обсуждаемой здесь статье.


    Да, Nemerle гибок, но недостаточно для создания любого внешнего (в терминах Фаулера) DSL. Да и возможностей рефакторинга у него ноль на данный момент... Но это не означает, что в этой теме Nemerle лишний на 100%.

    А за разворачивание чересчур уж бурной дискуссии я ответственности не несу — я всего лишь защищался
    Re[11]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 10:16
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Если ты говоришь об объявлении физической переменной произвольной размерности без её предварительного описания в DSL


    Да, именно об этом я и говорю

    O>то, во-первых, непонятно, на кой это надо,


    Ну как же Величины бывают разными

    O>во-вторых, можно добавить её описание в DSL


    Это не способ

    O>в третьих, всё равно тут синтаксис Nemerle позволяет писать более красивые вещи, чем скалярные параметры шаблонов C++. Например, имхо


    O>
    O>value_t<1, -2, 0> acc = value_t<1, -2, 0>(1);
    O>

    O>Выглядит очень непонятно (попробуй удержи в голове, какой параметр какому орту соответствует)

    Не, с порядком ортов как раз всё ОК. СГС — Сантиметр, Грамм, Секунда.

    O>и хуже, чем такой вариант (вполне реализуемый для Nemerle):

    def acc = phys-value[Time / (Length ^ 2)](1)

    Я не очень понял, что это
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[13]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 10:22
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Кстати, у меня возникает простой вопрос — неужели ты сам не мог додуматься до того, что я написал в сообщении?


    А зачем мучать себя догадками, когда проще спросить?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[9]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 17.04.06 10:23
    Оценка: +1
    Здравствуйте, Oyster, Вы писали:

    O>Да и те, другие, вопросы, тоже обсуждаются. Разговор ведь пошёл о Nemerle потому, что появилась идея, что всё это нагромождение из тулзов, предложенное товарищем из JetBrains, возможно, не нужно, а достаточно языка, который позволяет посать обработчики любых DSL на себе.


    Так вот интересно выслушать соображения о том, в каких случаях выгодно писать internal DSL (здесь уже как раз можно затронуть вопросы предпочтения одного языка другому в конкретных условиях), а в каких таки лучше предпочесть external DSL. Соответственно, узнать, что за цену придется платить в этом случае.

    O>А за разворачивание чересчур уж бурной дискуссии я ответственности не несу — я всего лишь защищался


    Оправдания -- признак признания вины

    Nemerle как раз в тему (я сам первым его название здесь упомянул ), но не в качестве противопоставления Nemerle rulez forever!, а C++ must die!
    Было бы интересно как раз примеры DSL на Nemerle видеть. Скажем о примере с размерностями. Для меня в нем самым интересным является как раз небольшой фрагмент с описанием одних величин через другие. Вот это выглядит интересно. Имхо, это то, что действительно можно считать удачным декларативным DSL. Как результат работы подобного DSL будет использоваться затем в программе -- это уже другой вопрос. Можно в виде 10 kg, как предлагалось. А можно и в виде результата кодогенерации. Например, для C++ можно было бы из подобного DSL сгенерировать набор не шаблонных классов (Mass, Length, Time, ...) определить для них набор перегруженных операторов (например, Length / Time дает Velocity) и вспомогательные функции. Чтобы запись выглядела как:
    Mass m1 = Cgs::mass(10);
    Mass m2 = Si::mass(m1);
    ...
    Length l1 = Cgs::length(100);
    Length l2 = Si::length(l1);
    ...
    Time t1 = Cgs::time(1);
    Time t2 = Si::time(t1);
    ...
    Velocity v1 = l2 / t1;

    Не так лаконично, как в Nemerle, но и без шаблонных наворотов. Примечательно, что аналогичным образом можно было бы генерировать код не только для C++, но и для других языков, например, C# или Java (однако со специальными костылями для отсутствия перегрузки операторов, чтобы можно было Length на Time делить ).

    Однако важно другое, что описание преобразования физических величин можно не хардкодить в виде ручного описания классов и их методов, а реализовать для этого описания DSL. Для языков с продвинутой поддержкой метапрограммирования (Nemerle, Lisp, Ruby) такой DSL можно построить в виде internal DSL (здесь мы получаем некоторые преимущества). В случее более ущемленных в этом плане языков (C#, Java, C++) придется использовать external DSL.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[7]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 10:27
    Оценка: :))
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Что примечательно, тогда тоже был C++ vs., правда, C#.


    Из чего следует, что на Си++ пишут, а на остальных языках мечтают
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[12]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 10:36
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Не, с порядком ортов как раз всё ОК. СГС — Сантиметр, Грамм, Секунда.


    А если СИ?

    O>>и хуже, чем такой вариант (вполне реализуемый для Nemerle):

    A>def acc = phys-value[Time / (Length ^ 2)](1)

    A>Я не очень понял, что это

    Ну как же — это задание типа величины: время / длина^2. Т.е. сек / м^2 или час / см^2. На самом деле, логичнее будет написать что-то вроде:

    def acc : custom-unit[Time * Mass / (Length ^ 3)] = 1

    Макрос custom-unit сгенерирует тип юнита с нужной размерностью на лету (я уже генерю такие типы в своих макро-операторах, поэтому технических проблем тут никаких). Имхо из такой записи сразу понятно, какой тип у юнита (в отличие от записи на шаблонах C++).
    Re[14]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 10:36
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>А зачем мучать себя догадками, когда проще спросить?


    Так спросил бы в одном сообщении, а не в пяти Впрочем, неважно — я готов объяснять до полного понимания
    Re[10]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 10:36
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Так вот интересно выслушать соображения о том, в каких случаях выгодно писать internal DSL (здесь уже как раз можно затронуть вопросы предпочтения одного языка другому в конкретных условиях), а в каких таки лучше предпочесть external DSL. Соответственно, узнать, что за цену придется платить в этом случае.


    Так заведи соответствующую дискуссию Что ты, собственно, и сделал ниже.

    O>>А за разворачивание чересчур уж бурной дискуссии я ответственности не несу — я всего лишь защищался


    E>Оправдания -- признак признания вины


    Хорошо, что ты не в суде работаешь

    E>Nemerle как раз в тему (я сам первым его название здесь упомянул ), но не в качестве противопоставления Nemerle rulez forever!, а C++ must die!

    E>Было бы интересно как раз примеры DSL на Nemerle видеть. Скажем о примере с размерностями. Для меня в нем самым интересным является как раз небольшой фрагмент с описанием одних величин через другие. Вот это выглядит интересно. Имхо, это то, что действительно можно считать удачным декларативным DSL.

    Это и дальше — +1.

    А насчёт external DSL... боюсь, что их писать тяжелее, чем internal. Т.е. я уверен, что тяжелее, но боюсь, что намного. Я, например, из статьи так и не понял, насколько сложно с помощью описанного инструмента создать собственный DSL. Т.е., например, прикрутить DSL, подобный использованному мной, к C++ имхо будет непросто — прийдётся писать как минимум файл грамматики для какого-то парсера вроде Coco/R или ANTLR вместе с кодом, который по AST будет как-то генерить C++-код. Вот мне в итоге непонятно, насколько это будет проще с использованием MPS... примеры из статьи ничего мне не показали в этом плане.
    Re[12]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 10:39
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>def acc = phys-value[Time / (Length ^ 2)](1)

    A>Я не очень понял, что это

    Должен заметить, что я, конечно, могу и на Nemerle написать макрос, с которым можно было бы писать что-то вроде

    def acc : custom-unit[1, -2, 0] = 1

    и это будет даже проще в реализации, но я сознательно не стану этого делать, поскольку запись будет менее интуитивной.
    Re[11]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 10:39
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>
    O>def acc = phys-value[Time / (Length ^ 2)](1)
    O>


    Ой да ладно. Вот это
    value[Time / (Length ^ 2)](1)
    что такое? Что это за (1)? Передача липового параметра в конструктор переменной единственный смысл которой задать выражению тип? И где тут аналогичный код? У меня тип задаётся слева. Никакого аналогичного кода я пока не увидел.

    O>Это я к тому, что тут шаблоны C++ не спасают и на Nemerle присутствует лучшее решение


    Только я его так и не увидел. Я ведь ясно сказал
    def acceleration_derivative_by_distance : ?что тут писать? =
       (acceleration2 - acceleration1) / (coord2 - coord1)

    Вставлять надо туда, где написано "?что тут писать?". а твоё решение как выглядит?
    def acceleration_derivative_by_distance =
       phys-value[1 / (Time ^ 2)]((acceleration2 - acceleration1) / (coord2 - coord1));

    И это типа лучше?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[16]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 10:40
    Оценка: -2
    Здравствуйте, Oyster, Вы писали:

    O>Сравниваются определение типа и определение типа. Жаль, что ты это не понял до этого момента.


    Влад назвал это оператором приведения типа.

    A>>Во-вторых, мой способ гибче, потому что я не принимаю Си за точку отсчёта и ничто не мешает написать

    A>>
    typedef physical_value_t<1, 0, 0, double, 100, 1, 1, 1, 1, 1> phys_meter_t;
    A>>typedef physical_value_t<1, 0, 0, double, 1, 1, 1, 1, 1, 1> phys_centimeter_t;

    O>Где же его большая гибкость, в таком случае?

    Гибкость в том, что CM теперь, без коэффициентов, а M = 100 CM.

    A>>В-третьих, новые типы определяются настолько редко, что затратами на их определение, тем более конкретизацию шаблона, можно пренебречь.


    O> Отличная отмазка


    У тебя есть данные, что новые типы определяются так же часто как используются?

    O>Кстати, сам автор исходной библиотеки на C++ признаёт, что такое решение коряво
    Автор: CrystaX
    Дата: 06.04.06
    .


    Это другая библиотека
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[12]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 10:42
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Ой да ладно. Вот это
    value[Time / (Length ^ 2)](1)
    что такое? Что это за (1)? Передача липового параметра в конструктор переменной единственный смысл которой задать выражению тип? И где тут аналогичный код? У меня тип задаётся слева. Никакого аналогичного кода я пока не увидел.


    Тип слева
    Автор: Oyster
    Дата: 17.04.06
    . Доволен?

    O>>Это я к тому, что тут шаблоны C++ не спасают и на Nemerle присутствует лучшее решение


    A>Вставлять надо туда, где написано "?что тут писать?". а твоё решение как выглядит?


    См. выше. И не придирайся к техническим мелочам
    Re[17]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 10:48
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Влад назвал это оператором приведения типа.


    Ты бы прочитал про мою библиотеку для начала. Кстати, где это Влад целую строку моего DSL назвал оператором приведения типа? Он говорил чисто про [ kg ], что преобразуется в унарный оператор. В целом же строка задаёт орт массы в системе СГС с коэффициентом нормализации.

    A>Гибкость в том, что CM теперь, без коэффициентов, а M = 100 CM.


    Отлично. Но кто тебе мешает вместо

    def vol = 100 m * 10 cm

    писать

    def vol = Si.Mass(100) * Cgs.Mass(10)

    ???

    A>У тебя есть данные, что новые типы определяются так же часто как используются?


    У меня есть данные о том, что записанные с помощью шаблонов юниты тяжело "читать".

    O>>Кстати, сам автор исходной библиотеки на C++ признаёт, что такое решение коряво
    Автор: CrystaX
    Дата: 06.04.06
    .


    A>Это другая библиотека


    Но решение похоже — согласись. Потому что C++ принуждает мыслить одинаково и набор его инструментов ограничен.
    Re[17]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 10:52
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Гибкость в том, что CM теперь, без коэффициентов, а M = 100 CM.


    Кстати, в моей библиотеке никто тебе не мешает написать не

    basisUnits (Si)
    (
        // ...
        Length[ m ],
        // ...
    ),
    
    // ...
    
    units (Cgs)
    (
        // ...
        Length[ cm ] - 1.0 / 100.0,
        // ...
    )

    а

    basisUnits (Si)
    (
        // ...
        Length[ m ] - 100.0,
        // ...
    ),
    
    // ...
    
    units (Cgs)
    (
        // ...
        Length[ cm ],
        // ...
    )

    т.е. считать не 1 м, а 1 см нормальной единицей измерения длины. Впрочем, ты должен понимать, что это совершенно непринципиально.
    Re[13]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 10:57
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Тип слева
    Автор: Oyster
    Дата: 17.04.06
    . Доволен?


    Абсолютно. Хотя лично мне 1 1 -2 и понятнее, подтверждаю, что ты (наконец то) привёл аналогичное решение.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[18]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 10:58
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    A>>Гибкость в том, что CM теперь, без коэффициентов, а M = 100 CM.

    O>Кстати, в моей библиотеке никто тебе не мешает написать не

    Это не гибкость. Гибкость это когда не надо переделывать библиотеку
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[14]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 11:01
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Абсолютно. Хотя лично мне 1 1 -2 и понятнее,


    Как ты понимаешь, так на Nemerle тоже можно
    Автор: Oyster
    Дата: 17.04.06
    . Но я не знаю, кому ещё такое будет понятнее.

    A>подтверждаю, что ты (наконец то) привёл аналогичное решение.


    Ну слава Богу!
    Re[19]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 11:01
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>>>Гибкость в том, что CM теперь, без коэффициентов, а M = 100 CM.

    O>>Кстати, в моей библиотеке никто тебе не мешает написать не

    A>Это не гибкость. Гибкость это когда не надо переделывать библиотеку


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

    В общем, к чему была эта фраза — не понял совершенно
    Re[14]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 11:06
    Оценка:
    Здравствуйте, adontz, Вы писали:

    O>>Тип слева
    Автор: Oyster
    Дата: 17.04.06
    . Доволен?


    A>Абсолютно. Хотя лично мне 1 1 -2 и понятнее, подтверждаю, что ты (наконец то) привёл аналогичное решение.


    В таком случае, ты готов признать свою неправоту
    Автор: adontz
    Дата: 16.04.06
    ?:

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


    Я имею в виду — ты согласен с тем, что для решения этой задачи, для указания типов явно и гибко скалярные параметры шаблонов не необходимы? И что аналогичное или превосходящее по гибкосте код на C++ решение можно написать на Nemerle?

    Я хочу убедиться в том, что ты понял всё то, о чём я говорил, чтобы впредь подобные "дискуссии" не повторялись
    Re[15]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 11:09
    Оценка: :)
    Здравствуйте, Oyster, Вы писали:

    O>Я имею в виду — ты согласен с тем, что для решения этой задачи, для указания типов явно и гибко скалярные параметры шаблонов не необходимы?


    Да

    O>И что аналогичное или превосходящее по гибкосте код на C++ решение можно написать на Nemerle?


    Выделеное вычёркиваем и я согласен.

    O>Я хочу убедиться в том, что ты понял всё то, о чём я говорил, чтобы впредь подобные "дискуссии" не повторялись


    А можно канфету в награду?
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[16]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 11:19
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    O>>Я имею в виду — ты согласен с тем, что для решения этой задачи, для указания типов явно и гибко скалярные параметры шаблонов не необходимы?

    A>Да

    Ок

    O>>И что аналогичное или превосходящее по гибкосте код на C++ решение можно написать на Nemerle?

    A>Выделеное вычёркиваем и я согласен.

    Почему вычёркиваем? Сваргать описание юнитов, подобное моему
    Автор: Oyster
    Дата: 10.04.06
    , на C++, а потом вычеркнем. Или заявишь, что моё описание менее удобно?

    O>>Я хочу убедиться в том, что ты понял всё то, о чём я говорил, чтобы впредь подобные "дискуссии" не повторялись

    A>А можно канфету в награду?

    Я это написал не ради поиздеваться, а для того, чтобы ты задумался над тем, что, возможно, не стоить охаивать какую-либо технологию, не попробовав её, и безапеляционно размышлять о вещах, в которых не разбираешься.

    Некрасиво писать про невозможность решение чего-либо на каком-либо языке (например, на Nemelre, в котором нет "нормальных шаблонов"), не попробовав (или спросив) об этом предварительно. Особенно если то, что написал, — ложь.
    Re[12]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 11:48
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    Хмм... это идея хорошая, не спорю. Думаю, я даже попробую, как будет время. Правда, тут есть один момент — моя лень Да и статьи я не то чтобы очень часто пишу (скорее, даже не пишу вообще).

    В любом случае, спасибо за идею и уверенность в том, что статья найдёт своего издателя — с такими начальными условиями можно и попробовать А уж читателя она найдёт — в этом я точно уверен Пусть эта библиотека никому и не нужна, зато используется в ней много всего.
    Re[13]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.04.06 12:25
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Хмм... это идея хорошая, не спорю. Думаю, я даже попробую, как будет время. Правда, тут есть один момент — моя лень Да и статьи я не то чтобы очень часто пишу (скорее, даже не пишу вообще).


    Лень говоришь? Значит создавать такой объемный код не лень, а описать его лень? Нда...

    С написанием статьи я помогу. Это не проблема. Ты хоть как-то напиши, а я подправлю/допишу.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 12:35
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Лень говоришь? Значит создавать такой объемный код не лень, а описать его лень? Нда...


    То ж другое дело Доступно объяснить другим тяжелее, чем написать, естественно.

    VD>С написанием статьи я помогу. Это не проблема. Ты хоть как-то напиши, а я подправлю/допишу.


    Ну я попробую
    Re[11]: Языково-ориентированное программирование: следующая
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 17.04.06 12:40
    Оценка: 31 (5) +1
    Здравствуйте, Oyster, Вы писали:

    O>А насчёт external DSL... боюсь, что их писать тяжелее, чем internal. Т.е. я уверен, что тяжелее, но боюсь, что намного.


    Все зависит от того, что за DSL мы хотим получить. Могу говорить исходя только из собственного опыта. Когда-то давно, в 2000 году был у меня опыт создания external DSL для вот этого инструмента
    Автор(ы): Евгений Охотников
    Дата: 31.03.2006
    Данная статья знакомит читателя с проектом SObjectizer -- инструментом для агентно-ориентированного программирования на C++. Раcсказывается о его истории, текущем состоянии и ближайших перспективах. Обсуждаются некоторые преимущества, которые дает SObjectizer, а также некоторые его недостатки и проблемы.
    . В нем агент HelloWorld, описанный в статье выглядел бы вот так:
    unit hello_world;
    
    uses so_lib;
    
    class cHelloWorld {
      event evtStart;
    
      state stNormal event evtStart;
    };
    
    event cHelloWorld.evtStart {{
      std::cout << "Hello, world!" << std::endl;
    
      SoSendMsgToAgent( "aScadaObjectizer", "msgNormalShutdown", "aScadaObjectizer", 0 );
    }}
    
    agent aHelloWorld of cHelloWorld {
      event evtStart
        priority 0
        message aScadaObjectizer.msgStart;
    }


    Это все. Определение C++ класса и его реализация генерировалась компилятором этого DSL. Можно сравнить с тем примером, который приведен в статье

    Но у external DSL было несколько недостатков.
    — диагностика ошибок времени компиляции сгенерированного C++ кода. Хоть в C++ код и вставлялись соответствующие инструкции #line, все равно сообщения были трехэтажные из-за хитрых имен классов и методов
    — отладка. В общем-то не так уж и страшно, т.к. код события практически один в один совпадал с кодом, укзанным в описании события в {{...}}. Но вот найти это место в горах автосгенерированного кода...
    — DSL был предназначен только для статических конфигураций, когда агенты не создаются и не удаляются в процессе работы динамически (сказалась заточенность под АСУТП задачи, где эта ситуация -- обычное дело).

    Самый большой недостаток external DSL -- это то, что это был собственный язык, который нуждался в собственном парсере и процессоре. Поэтому при реинкарнировании этого проекта в виде SObjectizer я очень серьезно думал, имеет ли смысл иметь DSL для описания агентов и их классов. В результате, из-за хронического недостатка времени было решено, что на реализацию транслятора нет ресурсов. Действительно, internal DSL на макросах C++ был сделан всего за пару дней. А первоначальный вариант транслятора показанного выше языка с использованием yacc разрабатывался несколько недель. Хотя основная трудоемкость была не в самом синтаксисе языка, сколько в создании корректного и полного кодогенератора.

    Тем не менее, при наличии соответствующих ресурсов и/или упрощающих дело инструментов external DSL может быть очень удобным. Из-за того, что:
    — external DSL может быть нейтральным по отношению к целевому языку. Например, IDL, из которого может генерироваться код для C++, Java, C#, Smalltalk и т.д.;
    — external DSL может быть очень выразительным и не содержать синтаксического оверхеда, который проникает в internal DSL из-за особенностей host-языка. Скажем, в Ruby для DSL используются объекты Symbol (для записи которых приходится использовать нотацию :identifier, хотя лидирующее двоеточие легко пропустить), объекты Hash (при использовании которых приходится использовать нотацию key => value, хотя '=>' в ряде случаев желательно было бы опускать), жестко заданный порядок следования аргументов (хотя в некоторых случаях было бы желательно иметь возможность какой-то аргумент опустить) или же оформлять составные аргументы в виде дополнительных Array или Hash;
    — external DSL могут позволять получать абстрактное представление описания (что-то вроде AST или какой-нибудь прикладной модели данных). Причем для разных задач можно получать разные модели. Скажем для статического анализа корректности связей между объектами -- одну модель, для рефакторинга -- другую, для построения документации -- третью. В случае internal DSL получение таких моделей может быть сильно затруднено;
    — external DSL могут не иметь проблем при интеграции в один проект нескольких DSL. Например, просто из-за того, что в рамках одного описания нельзя будет смешивать несколько DSL Либо же наоборот, DSL позволяет вставлять в себя вставки "непрозрачного" для него кода, который сохраняется на выходе. Что делает возможным организацию pipeline DSL-преобразований. Скажем, из одного DSL получается cpp-файл, который подается на вход следующему транслятору DSL, на выходе которого следующий cpp-файл и т.д. Хоть и звучит это сложно, но вполне возможно. Например, вот здесь
    Автор: eao197
    Дата: 08.09.05
    я приводил пример external DSL, который генерирует C++ код, содержащий еще один DSL внутри -- комментарии в соответствии с правилами Doxygen-а. А это делает возможным сгенерировать по результирующему C++ коду Reference Manual;
    — external DSL может позволять скрывать исходные тексты от клиента/заказчика в некоторых случаях. Например, для решения какой-то прикладной задачи мы используем external DSL и наши собственные, внутренние инструменты для его обработки. На выходе получаем набор исходных текстов для target-языка, по которым нельзя восстановить исходный DSL. Заказчику передается уже сгенерированный код, но не DSL-тексты. В результате мы можем иметь высокоэффективный внутренний инструмент, который мы не обязаны отдавать кому-либо даже при передаче всех исходников прикладной системы заказчику. Для которых языков программирования (для того же Ruby) сокрытие internal DSL от заказчика может быть просто не возможно.

    Может быть есть и еще какие-то бенефиты, я перечислил только то, что сам с ходу вспомнил.

    В общем, если для поддержки external DSL есть необходимые ресурсы/специалисты/инструменты, то external DSL в некоторых случаях могут быть весьма удобнее internal DSL. Не могу сказать, что это за случаи. Есть подозрение, что когда требуется описание нетривиальной предметной области или же одновременная поддержка нескольких target-языков.

    А вообще, это нужно на месте, в зависимости от конкретной задачи, конкретной команды и степени самоуверенности конкретного архитектора DSL принимать решение

    Одно для меня очевидно: internal DSL -- это, по сути, еще один способ оформления API (т.е. это больше Domain Specific language). А вот external DSL -- это уже создание отдельного языка (т.е. это больше Domain Specific Language).

    O>Я, например, из статьи так и не понял, насколько сложно с помощью описанного инструмента создать собственный DSL. Т.е., например, прикрутить DSL, подобный использованному мной, к C++ имхо будет непросто — прийдётся писать как минимум файл грамматики для какого-то парсера вроде Coco/R или ANTLR вместе с кодом, который по AST будет как-то генерить C++-код. Вот мне в итоге непонятно, насколько это будет проще с использованием MPS... примеры из статьи ничего мне не показали в этом плане.


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


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[6]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.04.06 12:53
    Оценка:
    Здравствуйте, eao197, Вы писали:

    Замени в своих словах Немерле на Руби и попробуй найти 10 отличий.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.04.06 12:53
    Оценка: +1
    Здравствуйте, Oyster, Вы писали:

    O>Да и те, другие, вопросы, тоже обсуждаются. Разговор ведь пошёл о Nemerle потому, что появилась идея, что всё это нагромождение из тулзов, предложенное товарищем из JetBrains, возможно, не нужно, а достаточно языка, который позволяет посать обработчики любых DSL на себе.


    Именно. Кто-то тоже самое сказал о Руби. И заметь их не нразвали фанатами.

    O>Да, Nemerle гибок, но недостаточно для создания любого внешнего (в терминах Фаулера) DSL. Да и возможностей рефакторинга у него ноль на данный момент... Но это не означает, что в этой теме Nemerle лишний на 100%.


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

    O>А за разворачивание чересчур уж бурной дискуссии я ответственности не несу — я всего лишь защищался


    Дисскуссия развернулась в основном с Адонцом. При этом она идет в общем-то не вокруг того плох Немерле или нет, а вокур того оправдан ли подход основанный на ДСЛ-ях. Естественно что в качесте примера приводится опыт из того языка который лучше всего подходит для ДСЛ-естроителства с нашей точки зрения. Зверек, как я понимаю, соглашаясь со мной в качестве языка для создания подразумевал использование Руби.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 17.04.06 13:15
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Именно. Кто-то тоже самое сказал о Руби. И заметь их не нразвали фанатами.


    Это Зверёк был.

    O>>Да, Nemerle гибок, но недостаточно для создания любого внешнего (в терминах Фаулера) DSL. Да и возможностей рефакторинга у него ноль на данный момент... Но это не означает, что в этой теме Nemerle лишний на 100%.


    VD>Глупость сказал. Создавать внешний ДСЛ можно на любом языке. Темболее на функциональном, так как они просто заточены на парсинг и генерацию.


    Я имел в виду, создать внешний так, чтобы он был внутренним

    VD>Дисскуссия развернулась в основном с Адонцом. При этом она идет в общем-то не вокруг того плох Немерле или нет, а вокур того оправдан ли подход основанный на ДСЛ-ях. Естественно что в качесте примера приводится опыт из того языка который лучше всего подходит для ДСЛ-естроителства с нашей точки зрения. Зверек, как я понимаю, соглашаясь со мной в качестве языка для создания подразумевал использование Руби.


    +1
    Re[6]: Языково-ориентированное программирование: следующая п
    От: GlebZ Россия  
    Дата: 17.04.06 13:27
    Оценка: :))) :)))
    Здравствуйте, eao197, Вы писали:

    E>Мужики, ну чесслово, забабахало. Может хватит поминать Nemerle на каждом шагу?

    Спокойней, спокойней. Я все жду пока количество ссылок обгонит Украину. здесь
    Автор: volk
    Дата: 24.03.06
    . Пока их всего то 2 тыщи с гаком.
    Re[5]: Языково-ориентированное программирование: следующая п
    От: GlebZ Россия  
    Дата: 17.04.06 14:01
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    VD>Это не верная логика. На ошибочном язые вообщен невозможно корректно описать задачу. Так что менять будет нечего.

    Влад, проблема не в том, что можно легко написать. Проблема в том, можно ли будет этот код сопровождать. В случае библиотек(а лучше говорить императивном OOП) я знаю кучу умных книжек и методов каким образом сделать такое решение, которое будет гибким. Это значит, что в любом месте мы для какой-то функциональности можем сделать особый случай не ломая общей архитектуры. Это достаточно сложная и большая по объему наука. В случае DSL я такого не видел. Никто не применял его именно для данной задачи, и не искал подводные камни. Чем обернется внесение изменений DSL и во что это обойдется для текущей функциональности, для меня остается загадкой. Я вполне понимаю что мы практически в каждой задаче делаем свой DSL. Но я и понимаю что ожидать от текущих инструментов.

    VD>ДСЛ тем и хорош, что он прост. В простом трудно ошибиться и его легко проверить.

    Вспомни задачку с зоопарком и сторожами(по моему ты ее описывал где-то на форуме). 100 процентно верная задача, оказалась неверной при развитии. Никто не знает где и как можно ошибиться.

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

    Проблема в том, что я знаю как исправлять логические ошибки.
    Re[17]: Языково-ориентированное программирование: следующая
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 17.04.06 14:44
    Оценка: -5
    Здравствуйте, Oyster, Вы писали:

    O>Почему вычёркиваем? Сваргать описание юнитов, подобное моему
    Автор: Oyster
    Дата: 10.04.06
    , на C++, а потом вычеркнем. Или заявишь, что моё описание менее удобно?


    Удобство это субъективный критерий, а о других я не услышал — так что равнозначно по функциональности. Вот и всё. Я не собираюсь в серьёз сравнивать решения на Nemerle и C++ потому что это очень разные языки. Это всё равно что сравнивать автобус и самосвал и доказывать, что автобус вообще для всех задач лучше, потому что там, мягкие сиденья.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[12]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.04.06 21:35
    Оценка:
    Здравствуйте, eao197, Вы писали:


    Все сказанное о внешних ДСЛ-ях в общем верно, но это не главное. Главное приемущество внешних ДСЛ-ей заключается в том, что они не содержат (могут не содержать) в себе возможностей универсальных языков, а заначит пригодны для исользования неподготовленными пользователями. Опять же обращусь к примеру клавиатурного конфига. Хотя он довольно гибок, но тем неменее не предоставляет опасных возможностей и может быть настроен конечным пользователем.

    Что же касается проблем интеграции и гибкости, то это зависит от инструмента. Тот же Немерле позволяет сделать очень многое.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.04.06 02:18
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>То ж другое дело Доступно объяснить другим тяжелее, чем написать, естественно.


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

    VD>>С написанием статьи я помогу. Это не проблема. Ты хоть как-то напиши, а я подправлю/допишу.


    O>Ну я попробую


    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: Языково-ориентированное программирование: следующая
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 18.04.06 05:02
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Главное приемущество внешних ДСЛ-ей заключается в том, что они не содержат (могут не содержать) в себе возможностей универсальных языков, а заначит пригодны для исользования неподготовленными пользователями.


    Ты с чего это взял?
    Возьми в качестве примера не собственный конфиг (кстати, там все настолько тривиально, что его и рассматривать не интересно), а тот же SQL.
    А еще лучше язык TeX. Много ли найдется специалистов, способных писать макропакеты для LaTeX или CONTeX непосредственно в TeX?
    Или PostScript.

    VD>Что же касается проблем интеграции и гибкости, то это зависит от инструмента. Тот же Немерле позволяет сделать очень многое.


    Влад, ты неисправим. Попробуй забыть о том что у тебя в руках чудо-молоток и все проблемы вокруг выглядят как гвозди. Каким образом Nemerle сможет решать проблемы, для которых предназначены TeX и PostScript?


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[3]: Языково-ориентированное программирование: следующая п
    От: Дарней Россия  
    Дата: 18.04.06 07:25
    Оценка: +1
    Здравствуйте, eao197, Вы писали:

    E>Ведь до сих пор на некоторых платформах C++ реализован через cfront и из C++кода генерируется C-код.

    E>А из трех существующих трансляторов Eiffel два (EiffelStudio и SmartEiffel) не генерируют нативного кода, а транслируют Eiffel в C-код (так же возможна трансляция либо в MSIL (EiffelStudio), либо в Java byte code (SmartEiffel)).

    к разграничению DSL/не DSL это не имеет никакого отношения.
    DSL может быть реализован как транслятор на другой язык, но это всего лишь особенности реализации. Обратить это выражение — логически неверно.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Всех излечит, исцелит
    добрый Ctrl+Alt+Delete
    Re[14]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 18.04.06 08:13
    Оценка:
    Здравствуйте, eao197, Вы писали:

    VD>>Что же касается проблем интеграции и гибкости, то это зависит от инструмента. Тот же Немерле позволяет сделать очень многое.


    E>Влад, ты неисправим. Попробуй забыть о том что у тебя в руках чудо-молоток и все проблемы вокруг выглядят как гвозди. Каким образом Nemerle сможет решать проблемы, для которых предназначены TeX и PostScript?


    На нём легко писать сканеры и парсеры для external DSL как и на Ocaml, например.
    Re[15]: Языково-ориентированное программирование: следующая
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 18.04.06 08:20
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>На нём легко писать сканеры и парсеры для external DSL как и на Ocaml, например.


    Если вести речь о качествах external DSL (удобство использования или степень соответствия решаемой задачи), то язык, на котором реализован сканер и парсер external DSL не имеет совершенно никакого значения


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[4]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 18.04.06 08:34
    Оценка:
    Здравствуйте, Дарней, Вы писали:

    E>>Ведь до сих пор на некоторых платформах C++ реализован через cfront и из C++кода генерируется C-код.

    E>>А из трех существующих трансляторов Eiffel два (EiffelStudio и SmartEiffel) не генерируют нативного кода, а транслируют Eiffel в C-код (так же возможна трансляция либо в MSIL (EiffelStudio), либо в Java byte code (SmartEiffel)).

    Д>к разграничению DSL/не DSL это не имеет никакого отношения.


    А смайлик в выброшенном тобой предложении из моего поста был намеряно проигнорирован?


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[16]: Языково-ориентированное программирование: следующая
    От: Oyster Украина https://github.com/devoyster
    Дата: 18.04.06 08:40
    Оценка:
    Здравствуйте, eao197, Вы писали:

    O>>На нём легко писать сканеры и парсеры для external DSL как и на Ocaml, например.


    E>Если вести речь о качествах external DSL (удобство использования или степень соответствия решаемой задачи), то язык, на котором реализован сканер и парсер external DSL не имеет совершенно никакого значения


    Конечно. Это я отвечал на вопрос о том, почему Влад приплёл Nemerle к внешним DSL.

    А вообще на Nemerle действительно легко делать такие штуки. Например, мне безумно понравился пример чего-то вроде ANTLR на макросах, который Влад уже приводил. К сожалению, nemerle.org с какой-то радости недоступен так что ссылку кинуть не могу...
    Re[5]: Языково-ориентированное программирование: следующая п
    От: Дарней Россия  
    Дата: 18.04.06 09:22
    Оценка:
    Здравствуйте, eao197, Вы писали:

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


    не хватает слова "лопата", так что до меня не дошло, где смеяться
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Всех излечит, исцелит
    добрый Ctrl+Alt+Delete
    Re[5]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 18.04.06 09:35
    Оценка:
    Здравствуйте, eao197, Вы писали:

    Д>>к разграничению DSL/не DSL это не имеет никакого отношения.


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


    Даже со смайликом тяжело рассматривать C++ или Eiffel как Domain-Specific Language
    Re[6]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 18.04.06 11:09
    Оценка:
    Здравствуйте, Oyster, Вы писали:

    O>Даже со смайликом тяжело рассматривать C++ или Eiffel как Domain-Specific Language


    А если в качестве Domain взять Object-Oriented & Generic Programming, а жирным выделить Language?

    И если сравнение C++ и Eiffel с DSL кажутся дикими, то как на счет Objective-C?



    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[7]: Языково-ориентированное программирование: следующая п
    От: Oyster Украина https://github.com/devoyster
    Дата: 18.04.06 12:42
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>А если в качестве Domain взять Object-Oriented & Generic Programming, а жирным выделить Language?


    Всё равно не смешно.

    Re[10]: Языково-ориентированное программирование: следующая
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.04.06 23:36
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>Чтобы добавить номер версии. вообще я просто привёл пример смены приоритетов. придумывать для такой замены смысл я не буду — это всего лишь пример.


    Я тебе отвечу проще. Проблепы конечно встречаются везде и всегда. Но тут есть одна закономерность... Чем строенее (красивее) решение, тем меньше с ним проблем. Ведь самоя большая проблема — это когда части задачи ускользают от разума. Так вот ДСЛ-подход зачастую позволят превратить переусложненную задачу в ту самую стройную красату.

    A>Потому что в когда Си++ придумывали никто грабли не проектировал, однако он есть Пока не начнёшь использовать что-то каждый день — недостатков не увидишь.


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

    A>Вааа наконецто!


    Что на конец-то? Этот примерчик прото детская игрушка по сравнению с другими примерами.

    A> Уже лучше!


    Лучше чем, простите, что?

    A>Да, признаю, некоторая ощютимая польза от макросов Nemеrle есть при сохранении условия простоты использования.


    О! И я о том же. И это только мелкий примерчик...
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: Языково-ориентированное программирование: следующая пара
    От: serb Россия  
    Дата: 19.04.06 12:01
    Оценка:
    Добрый день.
    Почитал я тут споры на счет трудности освоения DSL, за и против и тд.
    И набросал небольшой примерчик как я понимаю эту тематику. Очень хотелось бы чтобы кто-нибудь попинал.

    Для демонстрации нового подхода попробуем разработать систему “Расписание движения поездов метро”.
    1. Анализ предметной области.
    Предметная область, в которой будет работать наша система, будет метрополитен. Система должна рассчитать расписание движения поездов для метрополитена по различным входным параметрам, таким как загруженность линии, времени суток, количество персонала. Мы хотим, чтобы наша система была универсальной и подходила для описания схемы любого метрополитена. Для этого нужно разработать всю модель системы на предметном языке, а затем сгенерировать по ней некоторое ядро, а настраивать его будут пользователи системы.
    2. Проектирование предметной области.
    Основные элементы, которые будут входить в нашу систему это:
    1) Станция метро и её набор характеристик.
    2) Поезд метро и его набор характеристик.
    3) Переход между станциями и его набор характеристик.
    4) Переезд между станциями и его набор характеристик.
    5) Пассажир метро и его набор характеристик.
    6) Персонал метро и его набор характеристик.
    3. Реализация предметной области.
    Разрабатываем алгоритм составления расписания, который работает с объектами предметной области.
    Создаем команды нашего языка для манипулирования объектами предметной области:
    1) Создать станцию метро (Характеристика1,…).
    2) Создать переезд между станция_1 и станция_2(Характеристика 1,…).
    3) Создать переход между станция_1 и станция_2(Характеристика 1,…).
    4) Задать количество пассажиров на станции между время_1 и время_2(Характеристика 1,…).
    5) Создать поезд (Характеристика 1,…).
    6) Создать машиниста (Характеристика 1,…).
    7) Создать расписание.
    На данном этапе мы сделали модель предметной области и разработали язык для её описания и изменения. Язык описан в виде текста, но в общем случае это может быть что угодно: текст, таблицы, диаграммы или схемы. Функции этого языка сильно ограничены, но их достаточно для решения поставленной задачи. Теперь это концептуальное решение необходимо перевести в исходный код системы по следующим пунктам:

    1 Необходимо разработать генераторы, которые смогут преобразовать понятия “Станция метро”, “Поезд метро” в классы универсального языка программирования.
    Например:
    Понятие “Станция метро” будет преобразовано следующим образом:
    Class MetroStation
    {
        String Name;
        ...
    }

    Все остальные объекты предметной области преобразуются аналогично.

    2 При получении команды наша система должна сделать разбор команды, по возможности оптимизировать её и проверить на наличие ошибок(например попытку создания станции с пустым именем). После проверок наша система должна преобразовать команду из понятий предметной области в код. Например, команда “Создать станцию метро” может быть преобразована в следующий код
    metroStations.add(new MetrosStation(“Невский проспект”,…));

    Разработка системы завершена. Всю остальную настройку и доработку можно выполнить силами специалистов предметной области(Заказчиков).Этот пример очень простой для понимания принципов программирования в новом стиле, но его можно было бы расширить, добавив в команды функции создания новых элементов языка наравне с остальными, например, добавить понятие наземного перехода между станциями.
    Узким местом в этом примере является создание генераторов из концептуальной модели в код и проверка на корректность тех команд, которые вводит пользователь. Только невозможность автоматизировать этот процесс сводит на нет все достоинства новой методологии.
    Для того чтобы этот метод программирования заработал,необходимо, чтобы после разработки предметно ориентированного языка, позволяющего строить схему метро, программист смог использовать в своей программе некоторый редактор, что бы пользователи смогли спроектировать в нём метро своего города.

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


    Спасибо
    Re[8]: Языково-ориентированное программирование: следующая п
    От: Karabinos Украина  
    Дата: 19.04.06 12:03
    Оценка:
    Здравствуйте, adontz, Вы писали:

    A>А какая есть визуальная поддержка рефакторинга? Переименовать класс/метод? И сё? Не густо.


    Это NetBean



    Я, лично , часто пользуюсь "Rename" и "Encapsulate Fields..."
    Меньше читай, больше думай. (А.Сурожский)
    Re[2]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 19.04.06 12:18
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Может в данной теме это и оффтопик, но вот статья о другом подходе к разработке DSL, на основе существующего языка (Ruby, как можно было догадаться ):

    E>Взято из Ruby Code &amp; Style.

    Кстати, там идет интересное обсуждение: http://www.artima.com/forums/flat.jsp?forum=106&amp;thread=155752
    Цитата из первого поста:

    Building DSLs is the bread and butter of Smalltalk (and Lisp) programming, but is a bit of a struggle in the Java (and similar) worlds. The big vendors are attempting to fix this through the use of mighty tools in the interests of supporting a new-but-old-but-new model of development, a rather fishy proposition at best.

    This is symptomatic of one way in which the industry has decayed. The message of Smalltalk (and Lisp) is that the route to productivity is to use simple tools with few features and allow everyone interested to build upon them. The favoured route at the moment is to encode every good idea into an all-singing all-dancing "solution", take it or leave it.



    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[2]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 19.04.06 12:18
    Оценка:
    Здравствуйте, serb, Вы писали:

    S>Добрый день.

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

    <...прочитанное поскипано...>

    А что, собственно, требуется попинать?
    Вроде все складно написано...


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[2]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.04.06 17:54
    Оценка:
    Здравствуйте, serb, Вы писали:

    Задача какая-то надуманная.

    В метро все просто как дважды два. Есть заполнение поезда и есть интервал между поездами. Чем меньше интервал, тем больше пропускная способность и меньше заполнение поезда. Получается простая функция в которой можно управлять только интервалом.

    Что здесь решать то?
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: Языково-ориентированное программирование: следующая п
    От: der_user Россия  
    Дата: 27.04.06 17:59
    Оценка:
    Господа, извините, что перебиваю.
    Но baseLanguage, поставляемый в MPS заточен под Java. А есть аналог для C++ ?
    Мне охота проблем
    Re[4]: Языково-ориентированное программирование: следующая п
    От: denis8158  
    Дата: 12.10.08 11:38
    Оценка:
    Хочу предложить пример DSL языка, а заодно узнать возможно ли такое...
    В системе существуют несколько отдельных базовых блоков (смысловых):
    * журнал
    * форма для ввода
    * справочник
    ...
    Для этих базовых блоков были разработаны библиотеки для упрощения написания. Но вот изучение работы с этой библиотекой с её граблями, вилами и т. п. рабочей техникой, очень накладно для новых программистов (да и помнить все детали для старых). Не помогают ни примеры, ни техническая документация.

    Так вот, возможно ли, создать DSL с визардом, для уменьшения траты времени на обучения? Например, для создания журнала требуется определить все колонки журнала, фильтр, легенду и кнопки. Причём часть исходного кода должна генерироваться автоматически, а часть нужно было бы заполнить программисту (функционал кнопок, извращённые фильтры и т. п.).

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

    Возможно ли такое?
    Re[5]: Языково-ориентированное программирование: следующая п
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 12.10.08 13:22
    Оценка:
    Здравствуйте, denis8158, Вы писали:

    D>Возможно ли такое?


    Вам придётся писать специальный DSL, лёгкий для изучения. Возможно-то оно возможно, но вот разумно ли? Может, лучше поправить библиотеку и прикрутить к ней визарды?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re: Языково-ориентированное программирование: следующая пара
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.10.08 17:22
    Оценка:
    Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (пер, Вы писали:

    Народ! А что с MPF происходит сейчас?
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[2]: Языково-ориентированное программирование: следующая п
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.10.08 20:22
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Народ! А что с MPF происходит сейчас?


    Сори, в MPS, т.е. в Meta Programming System...
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[2]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 13.12.08 10:27
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (пер, Вы писали:


    VD>Народ! А что с MPF происходит сейчас?


    Сейчас оно вышло в виде бета-версии: http://www.jetbrains.com/mps/?dzone
    Финальный резил ожидается в первом квартале 2009 года.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[3]: Языково-ориентированное программирование: следующая п
    От: thesz Россия http://thesz.livejournal.com
    Дата: 13.12.08 12:07
    Оценка:
    E>Сейчас оно вышло в виде бета-версии: http://www.jetbrains.com/mps/?dzone
    E>Финальный резил ожидается в первом квартале 2009 года.

    Если ты оттуда, то это многое объясняет.
    Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
    Re[4]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 13.12.08 12:09
    Оценка:
    Здравствуйте, thesz, Вы писали:

    E>>Сейчас оно вышло в виде бета-версии: http://www.jetbrains.com/mps/?dzone

    E>>Финальный резил ожидается в первом квартале 2009 года.

    T>Если ты оттуда, то это многое объясняет.


    Я совсем не оттуда. Но был бы признателен, если бы ты объяснил, что означают твои слова (можно и в приват).


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[5]: Языково-ориентированное программирование: следующая п
    От: thesz Россия http://thesz.livejournal.com
    Дата: 13.12.08 17:55
    Оценка:
    E>Я совсем не оттуда. Но был бы признателен, если бы ты объяснил, что означают твои слова (можно и в приват).

    Если кратко, то MPS пишут неграмотные дурни.

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

    http://community.livejournal.com/ru_declarative/61479.html?nc=45
    http://thesz.livejournal.com/644592.html

    А вот посты товарища из той команды в ru_declarative:
    http://community.livejournal.com/ru_declarative/61857.html
    http://community.livejournal.com/ru_declarative/61953.html

    Надеюсь, многое объяснил.
    Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
    Re[6]: Языково-ориентированное программирование: следующая п
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 13.12.08 18:29
    Оценка:
    Здравствуйте, thesz, Вы писали:

    Ни за кого не выступаю, просто вспомнилось
    http://www.rsdn.ru/Forum/Message.aspx?mid=2046662&amp;only=1
    Автор: Gaperton
    Дата: 07.08.06
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[6]: Языково-ориентированное программирование: следующая п
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 14.12.08 13:00
    Оценка:
    Здравствуйте, thesz, Вы писали:

    E>>Я совсем не оттуда. Но был бы признателен, если бы ты объяснил, что означают твои слова (можно и в приват).


    T>Если кратко, то MPS пишут неграмотные дурни.


    T>Которым порекламировать своё произведение важнее, чем разобраться в проблеме по-настоящему.


    T>http://community.livejournal.com/ru_declarative/61479.html?nc=45

    T>http://thesz.livejournal.com/644592.html

    Судя по тому, что они набирают студентов и планируют открыть MPS (или ее части) в виде OpenSource, я бы сделал вывод, что начальство в JetBrains рассматривает данный проект в качестве инкубатора разработчиков. Из которого со временем можно будет брать наиболее толковых людей в реальные проекты.

    T>А вот посты товарища из той команды в ru_declarative:

    T>http://community.livejournal.com/ru_declarative/61857.html

    Код получился коротким, простым, и декларативным.


    Да, это он с "особым цинизмом"

    T>Надеюсь, многое объяснил.


    Собственно, я и сам о собственных знаниях и способностях не самого высокого мнения.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re: Языково-ориентированное программирование: следующая пара
    От: LaPerouse  
    Дата: 15.12.08 11:40
    Оценка:
    Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (пер, Вы писали:

    СДЗ>Статья:

    СДЗ>Языково-ориентированное программирование: следующая парадигма
    Автор(ы): Сергей Дмитриев
    Дата: 02.03.2006
    Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.


    СДЗ>Авторы:

    СДЗ> Сергей Дмитриев, Зверёк Харьковский (перевод)

    СДЗ>Аннотация:

    СДЗ>Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.


    А можно узнать, какая теория лежит в основе вашего подхода? Любая практическая реализация имеет в своей основе некоторую мат. теорию, описывающую вычислительный процесс.
    ... << RSDN@Home 1.2.0 alpha 4 rev. 1089>>
    Социализм — это власть трудящихся и централизованная плановая экономика.
    Re[2]: Языково-ориентированное программирование: следующая п
    От: thesz Россия http://thesz.livejournal.com
    Дата: 15.12.08 11:49
    Оценка:
    LP>А можно узнать, какая теория лежит в основе вашего подхода? Любая практическая реализация имеет в своей основе некоторую мат. теорию, описывающую вычислительный процесс.

    "Не советую. Съедят" (С) Понедельник начинается в субботу

    Нет у них никаких теорий. Ладно бы, своих не было, так они и чужих не знают и знать не хотят.
    Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.