Уместны ли внутренние "языки" ?
От: PSV100  
Дата: 15.02.12 16:41
Оценка:
Здравствуйте, уважаемые немерлисты. У меня маленький философский вопросик по поводу дизайна всяких своих DSL и ему подобных. Я Немерле только смотрел поверхностно, естественно много чего не знаю, не понимаю, не дочувствываю. Есть мысли попробовать Н на практике, если позволят условия (притягивание net-а в проект может создать проблемы). Я понимаю, что немерлевское расширение синтаксиса — это киллер-идея в дизайне языка. Здесь есть плюсы и минусы, по этому поводу дофига набито фингалов и до сих пор частенько бьют друг другу морду, не об этом речь. Хотя, конечно, из-за этого сложностей хватает, например, MetaLua — на порядок проще, легче (речь именно о восприятии, Lua c MetaLua и Немерле естно функционально несоизмеримы). Но не создает ли такое неограниченное (относительно) расширение перегибов палки для решения своих прикладных задач?
Не все лиспы идут на расширение синтаксиса, например, как кложура, опыт предков у нее есть. В Groovy, напр., есть концепция билдеров, Command chains, GPath и пр. — всё в рамках базового синтаксиса языка, всё гармонично смотрится. Конечно, "конкуренты" Немерля более ограничены в полётах, частенько всё расчитано на динамику и рантайм, а статичный контроль во время компиляции и поддержка всего синтаксиса в IDE плюс все профиты от компайл-тайм вычислений в Н — тут против танка не попрёшь.
Но всё-таки. Вот код из вики:
ExecuteReaderLoop ("SELECT * FROM employee WHERE firstname = $myparm", 
                   dbcon, 
{
  Nemerle.IO.printf ("Name: %s %s\n", firstname, lastname)
});


Здесь макро-навороты очень приятны, всё в пределах основного языка. То, что неявно вводятся переменные — хорошая помогалка.

Или вот:

[PegGrammar(Options = EmitDebugSources, start,
grammar
{  
  any                   = ['\u0000'..'\uFFFF'];
  digit                 = ['0'..'9']+;
  spaces : void         = ' '*;
  
  num                   : int = digit spaces;
  unaryMinus            : int = '-' spaces simplExpr;
  ...
 }
})]
public class CalcParser
{
    private num(digit : NToken) : int
    {
      int.Parse(GetText(digit))
    }
    
    private unaryMinus(_minus : NToken, se : int) : int
    {
      -se
    }
  ...
}


Я больше, чем уверен, что такую сложную штуку как PegGrammar специально дизайнили, чтобы всё гармонично вписывалось в основной язык, который по задумке шарпо-подобен.
Но здесь:
def makeClassInfoPage(cls : Type) : void
    {
      def props = cls.GetProperties();
      def events = cls.GetEvents();
      def title = $"The class <$(cls.Name)>";
      def html = xml <# 
        <html>
          <head>
            <title>$title</title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
            <link rel="stylesheet" href="http://rsdn.ru/css/article.css" type="text/css" />
          </head>
          <body marginwidth="20" marginheight="20">
            <H1>$title</H1>

            <H2 $unless (props.IsEmpty())>Properties</H2>
            <ol $unless (props.IsEmpty())>
              <li $foreach (p in props)>$(p.Name) : $(p.PropertyType)</li>
            </ol>

            <H2 $unless (events.IsEmpty())>Events</H2>
            <ol $unless (events.IsEmpty())>
              <li $foreach (e in events)>$(e.Name) : $(e.EventHandlerType)</li>
            </ol>
          </body>
        </html>
   #>;


уже есть вкрапление "инородного тела". С одной стороны, это лучше, чем просто многострочная строка, но с другой, возможно, было бы приятнее не смешивать коней и людей, и напр., вынести HTML в отдельный файлик со своим языком, где м.б. тоже есть поддержка от IDE, скажем, автокомплит повязан с основным кодом и т.п., плюс всё будет повязано в компайл-тайме как положено. У меня есть подозрение, что часто подобные DSL стараются оформлять отдельным исходником. Приведенный демо-пример не сильно показательный, я пытаюсь сказать, что можно прийти к каше в языке, что-то вроде PHP-лапши.
Например, вроде эрланговцев просят про мета-расширения, но те сопротивляются и кричат не трогайте основной язык, пляшите в сторонке. Имхо, рациональное зерно в этом есть. Конечно есть и положительные моменты, как вкрапления, скажем, регулярных выражений со своим синтаксисом, которые воспринимаются как какие-то бинарные вставки а-ля строковые литералы и т.п.

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