by chad myers lostechies.com. housekeeping stuff meet the presenter alt.net lostechies.com
TRANSCRIPT
Internal Domain-specific Languages in
C#By Chad MyersLosTechies.com
Housekeeping Stuff Meet the Presenter ALT.NET LosTechies.com
Introduction
Lambda Functions◦ Inline and Multiline ◦ Block
Closures Type, List, and Dictionary Initializers Type Inferrence Basics of Expression Trees Static Reflection
Quick Primer on Advanced C# 3.0
What? – “Language within a Language” for targeted, specific purpose
Why? – To enhance the usability of an API designed and highly targeted for a specific purpose
Who? – Martin Fowler, Jeremy Miller, Ayende Rahien, Jay Fields
When? – In .NET, primarily since C# 3.0 (mini-DSLs in .NET have existed since 1.1)
How? – Attend this Workshop! Read Fowler, Miller, Rahien, Fields
Internal DSL Introduction
Bending an existing language and compiler Unconventional – but still disciplined – use
of language techniques (Language Oriented Programming)
Focus on Flow, Comprehension and Accelerated Use of Finished Product
Should Be (Outwardly…):◦ Expressive◦ Efficient/Productive◦ Conventional (in the context of the domain)◦ Discoverable, Flowing
Internal DSL Concepts
Small DSLs◦ Problem/Purpose Identification◦ Pattern Application◦ Refactoring
Large DSLs◦ Problem/Purpose Identification◦ Major component Identification and Minimal
Design◦ Pattern Application◦ Refactoring
Internal DSL Strategies
End Result◦ Generative◦ Non-Generative
Internal Structure◦ Semantic Model (Internal & External)◦ No Model
Internal DSL Form and Type
Before we get into the meat, any questions?
Questions Here
Building Block Concepts◦ Context Variables and State Management◦ Generic Type Specifiers
Building Block Patterns◦ Method Chaining◦ Nested Function◦ Nested Closure◦ Literal Type/Collection Expression (Initializers)◦ Dynamic Reception (Extension Methods)◦ Parse Tree Manipulation (Expression Trees)
Internal DSL Patterns
Structural Patterns◦ Expression Builder◦ Object Scoping◦ Delegation (Nested Closures Revisited)◦ Convention
Internal DSL Patterns
Start with Host Object Return Host Object from Each Call Modifies State or Performs an Action Purpose:
◦ Assembly/Population of an Object or Objects◦ Allows for in-line or multi-line statements◦ Provides clear path for consumers
Examples:◦ System.DateTime◦ System.String
Method Chaining Pattern
Small, Focused, Deterministic Encapsulates Frequent Tasks Helps Keep Flow Helps Enhance Language Examples:
◦ DateTime.Parse(), *.Parse()◦ TimeSpan.FromMinutes
Nested Function Pattern
Delegation Scoping Physical Separation of Tasks Deterministic Resolution of Task Solves “Rathole” Problem Examples:
◦ Registry.Scan (StructureMap)◦ PersistenceModel.ForEach (Fluent Nhibernate)
Nested Closure Pattern
Type/Collection/Dictionary Initializers Can Replace Method Chaining in Many
Circumstances Can be More Expressive, in Less Spaces Examples:
◦ MsSqlConifgurationTester (Fluent Nhibernate)
Literal Type Expression Pattern
In C# 3.0, this means Extension Methods In C# 4.0, much, much more Attaching Different Behavior to Existing API Extensibility Point for Existing DSLs Allows for Different Grammars for Same API Examples:
◦ XmlExtensions (Fluent Nhibernate)◦ Specification Extensions (Fluent Nhibernate)
Dynamic Reception Pattern
In C#, this means Expression Trees Useful for Static Reflection Can Compose Expressions Examples:
◦ ClassMap<T> (Fluent Nhibernate)◦ EntityQuery stuff (Fluent Nhibernate)
Parse Tree Manipulation Pattern
Any questions on building block patterns?
Questions
State Management Progressive Interfaces The “Rathole” Problem Examples:
◦ CascadeExpression (Fluent Nhibernate)◦ ManyToManyPart (Fluent Nhibernate)◦ ActionLinkExpression (Dovetail)◦ ExpressionBase (Dovetail)
Expression Builder Pattern
Can be used directly, or serves as base class
Contains starter methods Launching point for other patterns Examples:
◦ Registry (StructureMap)◦ PersistenceModel (Fluent Nhibernate)
Object Scoping Pattern
Can also be structural Examples:
◦ ObjectFactory.Initialize (StructureMap)
Delegation (Nested Closures)
Discovery of types Identification of interesting types Application Examples:
◦ ITypeScanner (StructureMap)◦ AutoPersistenceModel (Fluent Nhibernate)
Conventions
Any questions on structural patterns?
Questions
Build a model-based generative Internal DSL for writing a fairy tale story
End result: Print the story to the debug window
Demonstrate as many patterns as possible in one DSL
In Practice: Fairy Tale Builder
FairyTale object Story Parts (Intro, focus, plot, ending) Rendering
Fairy Tale Model
Delegation -- Nested Closure Expression Builder in closure Method Chaining with Generic Type
Specifiers Literal Type Expressions Parse Tree Manipulation Dynamic Reception
Fairy Tale Builder
Any questions on Fairy Tale Builder?
Questions
Chad [email protected]
http://chadmyers.lostechies.com
Martin Fowler’s DSL WIPhttp://martinfowler.com/dslwip
Closing