Lambda Functions ◦ Inline and Multiline ◦ Block Closures Type, List, and Dictionary Initializers Type Inferrence Basics of Expression Trees Static Reflection
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
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
Small DSLs ◦ Problem/Purpose Identification ◦ Pattern Application ◦ Refactoring Large DSLs ◦ Problem/Purpose Identification ◦ Major component Identification and Minimal Design ◦ Pattern Application ◦ Refactoring
End Result ◦ Generative ◦ Non-Generative Internal Structure ◦ Semantic Model (Internal & External) ◦ No Model
Before we get into the meat, any questions?
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)
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
Delegation Scoping Physical Separation of Tasks Deterministic Resolution of Task Solves “Rathole” Problem Examples: ◦ Registry.Scan (StructureMap) ◦ PersistenceModel.ForEach (Fluent Nhibernate)
Type/Collection/Dictionary Initializers Can Replace Method Chaining in Many Circumstances Can be More Expressive, in Less Spaces Examples: ◦ MsSqlConifgurationTester (Fluent Nhibernate)
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)
In C#, this means Expression Trees Useful for Static Reflection Can Compose Expressions Examples: ◦ ClassMap (Fluent Nhibernate) ◦ EntityQuery stuff (Fluent Nhibernate)
Any questions on building block patterns?
State Management Progressive Interfaces The “Rathole” Problem Examples: ◦ CascadeExpression (Fluent Nhibernate) ◦ ManyToManyPart (Fluent Nhibernate) ◦ ActionLinkExpression (Dovetail) ◦ ExpressionBase (Dovetail)
Can be used directly, or serves as base class Contains starter methods Launching point for other patterns Examples: ◦ Registry (StructureMap) ◦ PersistenceModel (Fluent Nhibernate)
Can also be structural Examples: ◦ ObjectFactory.Initialize (StructureMap)