Идеи о синтаксисе C # DSL - PullRequest
3 голосов
/ 17 мая 2010

Я думаю о реализации шаблонизатора с использованием только простого C # /. NET 4 синтаксиса с преимуществом статической типизации.

Затем на этом языке шаблонов мы могли бы создать доменные языки (скажем, HTML4, XHTML, HTML5, RSS, Atom, многокомпонентные электронные письма и т. Д.).

Один из лучших DSL в .NET 4 (если не только один) - SharpDOM . Он реализует специфичный для HTML DSL.

Глядя на SharpDOM, я действительно впечатлен тем, что вы можете сделать с помощью .NET (4).

Так что я считаю, что есть некоторые не очень известные способы реализации пользовательских DSL в .NET 4. Возможно, не так хорошо, как в Ruby, но все же.

Таким образом, мой вопрос: Каковы особенности синтаксиса C # (4), которые можно использовать для реализации пользовательских DSL?

Примеры, которые я могу вспомнить прямо сейчас:

// HTML - doesn't look tooo readable :)
div(clas: "head",
  ul(clas: "menu", id: "main-menu", () => {
    foreach(var item in allItems) {
      li(item.Name)
    }
  }) // See how much noise it has with all the closing brackets?
)

// Plain text (Email or something) - probably too simple
Line("Dear {0}", user.Name);
Line("You have been kicked off from this site");

Для меня действительно сложно придумать синтаксис с минимальным количеством шума .

Обратите внимание, что я не говорю о другом языке (Boo, IronRuby и т. Д.), А также не говорю о различных шаблонизаторах (NHaml, Spark, StringTemplate и т. Д.).

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Знаете ли вы о шаблонах T4 ? Хотя он не позволяет вам создавать DSL, он, безусловно, удобен для генерации кода или других текстовых артефактов, когда у вас есть модель для работы. Например, TextTemplate1.tt:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".thml" #>
<#@ import namespace="System.Collections.Generic" #>

<div class="head">
    <ul class="menu" id="main-menu">
<#
foreach (var item in allItems)
{
#>
        <li><#= item.Name #></li>
<#
}
#>
    </ul>
</div>
<#+
public class DummyItem
{
    public string Name {get;set;}
}

public List<DummyItem> allItems = new List<DummyItem>
                                  {
                                      new DummyItem {Name="Name1"},
                                      new DummyItem {Name="Name2"},
                                  };
#>

Это быстро произвело:

<div class="head">
    <ul class="menu" id="main-menu">
        <li>Name1</li>
        <li>Name2</li>
    </ul>
</div>

Очевидно, вам нужно будет ввести свою модель в систему не так, как создание фиктивного класса!

1 голос
/ 18 мая 2010

Полагаю, вы знакомы с книгой Мартина Фаулера о DSL, но если не уверены, посмотрите на нее Он не содержит ничего специфического для C # 4.0, но имеет некоторые общие шаблоны для внутренних DSL, которые вы можете использовать. Также посмотрите, как универсальные типы и вывод типов работают в C #, LINQ может быть хорошим примером использования расширенных языковых функций для реализации DSL. В LINQ также должны быть некоторые манипуляции с AST, которые также могут вас заинтересовать.

...