As Leonid mentions in [one of his answers](http://mathematica.stackexchange.com/a/109917/34008) one of the methods of managing complexity is using [Domain Specific Languages (DSL's)](https://en.wikipedia.org/wiki/Domain-specific_language). In this answer I will provide links to documents, packages, blog posts, and discussions of creating and utilizing DSL's in *Mathematica*. For a 2.5 minutes introduction see [this video](http://www.wolfram.com/broadcast/video.php?c=400&v=1470) between 25:00 and 27:30. **When to apply DSL's** Here are some cases for applying DSL. 1. When designing conversational engines. 2. When there are too many tuning options and usage scenarios of the developed algorithms. * For example, we have a bunch of search, recommendation, and interaction algorithms for a dating site. A different department designs interactive user interfaces for these algorithms. We make a natural language DSL that invokes the different algorithms according to specified outcomes. 3. When designing an API for a collection of algorithms. * Just designing a DSL can bring clarity of what signatures should be in the API. * `NIntegrate`'s `Method` option was designed and implemented using a DSL. See [this video](http://www.wolfram.com/broadcast/video.php?c=400&v=1470) between 25:00 and 27:30. **Designing DSL** 1. Decide what kind of sentences the DSL is going to have. * Are natural language sentences going to be used? * Are the sentences mathematical in nature? 2. Prepare, create, or accumulate sentences. * In some cases using [Morphological Analysis](https://en.wikipedia.org/wiki/Morphological_analysis_(problem-solving)) can greatly help for coming up with use cases and the corresponding sentences. 3. Create a context free grammar that describes the sentences. (Or a large subset of them.) * At this stage I use exclusively [Extended Backus-Naur Form (EBNF)](https://en.wikipedia.org/wiki/Extended_Backus–Naur_Form). 4. Program parser(s) for the grammar. * I use most of the time [functional parsers](https://en.wikipedia.org/wiki/Parser_combinator). * The package [FunctionalParsers.m](https://github.com/antononcube/MathematicaForPrediction/blob/master/FunctionalParsers.m) provides a *Mathematica* implementation of this kind of parsing. * The package can automatically generate parsers from a grammar given in EBNF. (See the coding example below.) 5. Program an interpreter for the parsed sentences. * At this stage the parsed sentences are hooked to the algorithms of the problem domain. * In *Mathematica* this can be done fairly easy using `Case` to pick grammar rule wrappers. 6. Test the parsing and interpretation. See the example below illustrating steps 3-6. **Introduction to using DSL's in Mathematica** 1. This blog post of mine ["Natural language processing with functional parsers"](https://mathematicaforprediction.wordpress.com/category/functional-parsers/). 2. This detailed slide-show presentation ["Functional parsers for an integration requests language grammar"](https://github.com/antononcube/MathematicaForPrediction/blob/master/Documentation/Functional%20parsers%20for%20an%20integration%20requests%20language%20grammar.pdf) shows how to use the package [FunctionalParsers.m](https://github.com/antononcube/MathematicaForPrediction/blob/master/FunctionalParsers.m) over a small grammar. **Advanced example** The blog post ["Simple time series conversational engine"](https://mathematicaforprediction.wordpress.com/2014/11/29/simple-time-series-conversational-engine/) discusses the creation (design and programming) of a simple conversational engine for time series analysis (data loading, finding outliers and trends.) Here is movie demonstrating that conversation engine: [http://youtu.be/wlZ5ANglVI4](http://youtu.be/wlZ5ANglVI4). **Other discussions** The [answer](http://mathematica.stackexchange.com/questions/49052/css-selectors-for-symbolic-xml/49053#49053) of the MSE question "CSS Selectors for Symbolic XML" uses [FunctionalParsers.m](https://github.com/antononcube/MathematicaForPrediction/blob/master/FunctionalParsers.m). **Coding example** This example is for the steps 3-6 of the second section. [![enter image description here][1]][1] [1]: https://i.sstatic.net/WDvvR.png