2010-05-17 6 views
3

템플릿 엔진을 구현하려면 일반 C#/.NET 4 구문 만 사용하여 정적 입력의 이점을 얻으려고합니다.C# DSL 구문에 대한 아이디어

그런 다음 템플릿 언어를 사용하여 도메인 특정 언어 (HTML4, XHTML, HTML5, RSS, Atom, Multipart Emails 등)을 만들 수 있습니다.

.NET 4에서 최고의 DSL 중 하나 (하나가 아닌 경우)는 SharpDOM입니다. HTML 관련 DSL을 구현합니다.

SharpDOM을 보면 .NET (4)을 사용하여 할 수있는 것에 깊은 인상을 받았습니다.

.NET에서 사용자 지정 DSL을 구현하는 데별로 잘 알려지지 않은 방법이 있다고 생각합니다. 아마도 Ruby뿐만 아니라 여전히 그렇습니다.

내 질문에 : 사용자 지정 DSL을 구현하는 데 사용할 수있는 C# (4) 특정 구문 기능은 무엇입니까? 내가 지금 생각할 수있는

예 : 나를 위해

// 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 등)에 대해서도 말하고 있지 않습니다.

답변

1

나는 마틴 파울러 DSL 책에 익숙하다고 생각하지만 분명히 살펴 보지 않을 것이다. C# 4.0에만 한정된 것은 아니지만 사용할 수있는 내부 DSL에 대한 일반적인 패턴이 있습니다. 또한 C#에서 제네릭 형식과 형식 유추가 작동하는 방식을 살펴보면 LINQ가 고급 언어 기능을 사용하여 DSL을 구현하는 좋은 예가 될 수 있습니다. LINQ에있는 것들도 AST 조작이어야하는데, 이것은 당신에게도 흥미로울 것입니다.

+0

현재 구현 세부 사항을 찾는 것이 아니라 구체적인 구문의 디자인에 대해 생각하고있는 경우 사람들이 코드를 작성하는 방법에 대한 좋은 예가 있습니다. –

+0

@Dmitriy Nagirnyak (귀하의 경우 템플리트 엔진) 및 도메인 전문가 (C# GUI 개발자)와 도메인 사용자 (귀하의 선택)가 귀하의 DSL에 대한 대상입니다. 그래서 나는 이것이 대답할만한 질문이 아니라 목표 청중에 달려 있다고 말할 것입니다. 다른 템플릿 엔진의 구문을 비교하는 설문 조사를 만들어 사람들이 사용하는 것을 찾아내는 것이 좋습니다. –

+0

대상 고객은 C# developers입니다. 구문을 비교하는 설문 조사를 만들 수 없습니다. 구문이 아직 없습니다.이 질문의 puprose는 C# 4에서 사용 가능한 구문을 찾아내는 것입니다. –

2

당신은 T4 Templates을 알고 계십니까? 을 만들 수는 없지만 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> 

물론, 당신이 시스템에 더미 클래스를 만드는 것보다 다른 방법으로 모델을 얻을 것이다!

관련 문제