<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://bloggingabout.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'Oslo', 'M Language', and 'Textual DSL'</title><link>http://bloggingabout.net/search/SearchResults.aspx?a=1&amp;o=DateDescending&amp;tag=Oslo,M+Language,Textual+DSL&amp;orTags=0</link><description>Search results matching tags 'Oslo', 'M Language', and 'Textual DSL'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Oslo : Building textual DSLs</title><link>http://bloggingabout.net/blogs/dennis/archive/2008/10/30/oslo-building-textual-dsls.aspx</link><pubDate>Thu, 30 Oct 2008 19:48:43 GMT</pubDate><guid isPermaLink="false">813b6dfd-644e-4573-a816-eebab56ba0d0:476380</guid><dc:creator>Dennis van der Stelt</dc:creator><description>&lt;p&gt;This is the geek *** session Don Box mentioned. Chris Anderson and Giovanni Della-Libera are presenting, the entire Oslo team that’s here is inside this room.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dennis/IMG_5F00_3257_5F00_5DDC4A69.jpg"&gt;&lt;img title="IMG_3257" style="display:inline;" height="180" alt="IMG_3257" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dennis/IMG_5F00_3257_5F00_thumb_5F00_09E9218E.jpg" width="240" border="0" /&gt;&lt;/a&gt; &lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dennis/IMG_5F00_3260_5F00_32C410CA.jpg"&gt;&lt;img title="IMG_3260" style="display:inline;" height="180" alt="IMG_3260" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dennis/IMG_5F00_3260_5F00_thumb_5F00_3B83F349.jpg" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;module PDC&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; language Contacts &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; syntax Main = &lt;span style="color:blue;"&gt;checked&lt;/span&gt;:Contact =&amp;gt; &lt;span style="color:blue;"&gt;checked&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; syntax Contact = &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;Contact&amp;quot;&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;:&amp;quot;&lt;/span&gt; a:Alias =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Contact { Alias { a } };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; |&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;Contact&amp;quot;&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;:&amp;quot;&lt;/span&gt; a:Alias &lt;span style="color:#a31515;"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; n:PhoneNumber =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Contact { Alias { a }, Phone {phone} };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; token Alias = (&lt;span style="color:#a31515;"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;..&lt;span style="color:#a31515;"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt; | &lt;span style="color:#a31515;"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;..&lt;span style="color:#a31515;"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;)+;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; token Digit = &lt;span style="color:#a31515;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;..&lt;span style="color:#a31515;"&gt;&amp;quot;9&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; token PhoneNumber = Digit#3 &amp;quot;-&amp;quot; Digit#3 &amp;quot;-&amp;quot; Digit#4;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; interleave TokensIHate = &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt; | &lt;span style="color:#a31515;"&gt;&amp;quot;\r&amp;quot;&lt;/span&gt; | &lt;span style="color:#a31515;"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;+;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Tokenize is the first thing to do. The above can transform “Contact : dvdstelt - 425-555-1212”, and it removes weird characters. Chris and Gio than show how lists work, how the recursive results are flattened out, how to add comments and&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dennis/IMG_5F00_3263_5F00_1FFEF146.jpg"&gt;&lt;img title="IMG_3263" style="display:inline;margin:0px 0px 0px 5px;" height="180" alt="IMG_3263" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/dennis/IMG_5F00_3263_5F00_thumb_5F00_26161814.jpg" width="240" align="right" border="0" /&gt;&lt;/a&gt; mgx.exe is used to generated an mgx file.&lt;/p&gt;  &lt;p&gt;mgx /r:contacts.mgx input.contacts will generate M language code. The mgx is just a plain .zip file, as said before in one of my posts.&lt;/p&gt;  &lt;p&gt;mgx /r:contacts.mgx input.contacts /t:xaml for transformation to xaml&lt;/p&gt;  &lt;p&gt;You can Integrate MGrammar into the CLR&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Use MSBuild tasks, include the .mg file in your solution and setup the msbuild file (csproj) &lt;/li&gt;    &lt;li&gt;Use the MgrammarCompiler, which is an in memory compiler &lt;/li&gt;    &lt;li&gt;DynamicParser &lt;/li&gt;    &lt;li&gt;IGraphBuilder &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A cool example of some MGrammer was grammar code for MSI setup package. MSI is really complex to write, so Chris and Gio build MGrammar to build the MSI. But their MGrammer became so complex, that they wrote another MGrammer code library to generate the other MGrammer code to generate the MSI installer ‘code’. The final result is about 50 lines of MGrammer and 400 lines of C#, pretty maintainable I’d say.&lt;/p&gt;  &lt;p&gt;To sum up, MGrammer is a language for creating textual DSLs. The specification will be released under OSP, as noted on many other weblogs.&lt;/p&gt;  &lt;p&gt;You can build your own language right now! Download at &lt;a href="http://msdn.microsoft.com/oslo/"&gt;http://msdn.microsoft.com/oslo/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Best PDC session so far : Lap around “Oslo”</title><link>http://bloggingabout.net/blogs/dennis/archive/2008/10/28/best-pdc-session-so-far-lap-around-oslo.aspx</link><pubDate>Tue, 28 Oct 2008 22:38:02 GMT</pubDate><guid isPermaLink="false">813b6dfd-644e-4573-a816-eebab56ba0d0:476311</guid><dc:creator>Dennis van der Stelt</dc:creator><description>&lt;p&gt;I’m at the “Lap around ‘Oslo’” talk together with &lt;a href="http://www.alexthissen.nl/"&gt;Alex Thissen&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/pgielens/"&gt;Paul Gielens&lt;/a&gt;. This is by far the best session I’ve seen so far!&lt;/p&gt;  &lt;p&gt;The talk began about models. We were looking at modeling and modeling domains, but what is a model? We have…&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Drawings&lt;/strong&gt;       &lt;br /&gt;Models used to communicate with others, for example DataFlow or Use Case. See &lt;a href="http://bloggingabout.net/blogs/dennis/archive/2005/10/13/9767.aspx"&gt;UML as Sketch&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Model-Assisted        &lt;br /&gt;&lt;/strong&gt;Models used to understand or manipulate code, for example StaticStructure or Sequence &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Model-Driven&lt;/strong&gt;       &lt;br /&gt;Models executed by runtimes directly, for example HTML, CSS, XAML, BPEL &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;According to Douglas Purdy, Don Box says we’re on a 30 year journey and we’re 15 years in. We had COM(+), .NET 1.0, Web Services, .NET 3.0 and now we’re entering the next phase. Oslo is the next level for a model-driven platform. We’ve been heading there via configuration, attributes and doing more and more declarative instead of typing everything out. A great example for declarative development is of course LINQ.&lt;/p&gt;  &lt;p&gt;Why is this happening? Transparency (better understand your application), flexibility (add changes to your application faster) and productivity. We need models&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;So what is Oslo?      &lt;br /&gt;&lt;/strong&gt;It is &lt;em&gt;the platform&lt;/em&gt; for model-driven development. Microsoft will bring us Oslo with the following components:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;“M”      &lt;br /&gt;The language for authoring models &amp;amp; DSLs &lt;/li&gt;    &lt;li&gt;“Quadrant”      &lt;br /&gt;The tool for interacting with models &amp;amp; DSLs &lt;/li&gt;    &lt;li&gt;Repository      &lt;br /&gt;The database for storing &amp;amp; sharing models, this will be SQL Server. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;“M” gives you the modelling and textual DSLs. According to &lt;a href="http://douglaspurdy.com/"&gt;Douglas Purdy&lt;/a&gt; and to &lt;a href="http://www.pluralsight.com/community/blogs/dbox/archive/2008/10/08/talks-i-want-to-see-pdc.aspx"&gt;Don Box&lt;/a&gt;, this is going to be the next big thing. I could not agree more. I am &lt;strong&gt;SO&lt;/strong&gt; excited about what I just saw. Take the example they’ve shown.&lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;Module Microsoft.Samples&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:green;"&gt;// MusicItem is the schema&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; type MusicItem&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// Primary key&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Id : Integer64 = AutoNumber();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Album : Text; &lt;span style="color:green;"&gt;// Album is constraint by type&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Artist : Text;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// Rating is constraint and expression&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Rating : Integer32 where value &amp;lt;= 3;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; } where identity Id;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:green;"&gt;// * is 0..n multiplicity&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; MusicLibrary : MusicItem*;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The above declares a schema named “MusicItem” and a collection of those in a “MusicLibrary”. We compile this and than populate the result in the database.&lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// M compiler&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Repository is the database. When choosing -t:xml we generate XML&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;m.exe myfile.m /p:image -t:Repository&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Populating&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;mx.exe /i:myfile.mx /db:repository /ig /f&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;mx uses the compiled “binary” (this is a zip archive actually) and generates T-SQL.&lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;create table [Microsoft.Samples].[MusicLibrary]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; -- the rest&lt;/p&gt;    &lt;p style="margin:0px;"&gt;)&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;You can fill the database with the following&lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;Module Microsoft.Samples&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; MusicLibrary&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Album = &lt;span style="color:#a31515;"&gt;&amp;quot;Slippery when wet&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Artitst = &lt;span style="color:#a31515;"&gt;&amp;quot;Bon Jovi&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Rating = 3&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; },&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Album = &lt;span style="color:#a31515;"&gt;&amp;quot;Into the dark&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Artitst = &lt;span style="color:#a31515;"&gt;&amp;quot;Europe&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Rating = 2&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&amp;#160; &lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;This creates two rows in the table MusicLibrary. But this is all the language “M”. How about a &lt;strong&gt;textual DSL&lt;/strong&gt;? How’s this for coding:&lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;SomeAlbum&amp;quot;&lt;/span&gt; by &lt;span style="color:#a31515;"&gt;&amp;quot;Led Zeppelin&amp;quot;&lt;/span&gt; &lt;span style="color:blue;"&gt;is&lt;/span&gt; awesome!&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Back in Black&amp;quot;&lt;/span&gt; by &lt;span style="color:#a31515;"&gt;&amp;quot;AC/DC&amp;quot;&lt;/span&gt; &lt;span style="color:blue;"&gt;is&lt;/span&gt; so so.&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Bad&amp;quot;&lt;/span&gt; by &lt;span style="color:#a31515;"&gt;&amp;quot;Michael Jackson&amp;quot;&lt;/span&gt; &lt;span style="color:blue;"&gt;is&lt;/span&gt; terrible.&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The above code can be transformed into the exact same code-block as above, where we filled the database with two records. How is this achieved? Take a look at the following code.&lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;module Microsoft.Samples&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; import Language;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; language MusicLibraryLanguage&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; syntax Main = s:Statement+ =&amp;gt; MusicLibrary(valuesof(s){l&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; syntax Statement = al:Grammar.TextLiteral &lt;span style="color:#a31515;"&gt;&amp;quot;by&amp;quot;&lt;/span&gt; ar:Gramar.TextLiteral &lt;span style="color:#a31515;"&gt;&amp;quot;is&amp;quot;&lt;/span&gt; ?????&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; =&amp;gt; { Album {al}, Artist {ar}, Rating&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; @{(Classification[&lt;span style="color:#a31515;"&gt;&amp;quot;keyworkd&amp;quot;&lt;/span&gt;]} &lt;span style="color:green;"&gt;// colorize &amp;quot;awful&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; token Rating1 = &lt;span style="color:#a31515;"&gt;&amp;quot;terrible&amp;quot;&lt;/span&gt; | &lt;span style="color:#a31515;"&gt;&amp;quot;awful&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; token Rating2 = &lt;span style="color:#a31515;"&gt;&amp;quot;so so&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; token Rating3 = &lt;span style="color:#a31515;"&gt;&amp;quot;awesome&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; syntax Rating = Rating1 =&amp;gt; 1 | Rating2 =&amp;gt; 2 | Rating3 =&amp;gt; 3;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; interleave skippable = Base.Whitespace&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;I lost the code where it says “????”. The above code tells to look at &lt;em&gt;by&lt;/em&gt; and &lt;em&gt;is&lt;/em&gt; and takes the text there and parse it. It than looks at the rating and gives it an actual number. The &lt;em&gt;Classification&lt;/em&gt; keyword makes the words “terrible” and “awful” become &lt;strong&gt;bold&lt;/strong&gt; in the editor.&lt;/p&gt;  &lt;p&gt;Now is this awesome or what? I’m so excited by this. This is one of the biggest steps in my history of developing software. You can now write code like&lt;/p&gt;  &lt;p&gt;Give me a table called “Customers” with a primary key called “Id” and make it an integer with identity on, seeding from 1.&lt;/p&gt;  &lt;p&gt;The best thing is, if you can think of a way to make that sentence shorter or more self-explaining, go ahead! Use MGrammer to define your own textual DSL.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MService&lt;/strong&gt;     &lt;br /&gt;Another great demo was when they showed MService. With only a few lines of code (my battery ran flat, so I could not copy the code, but I photographed it and it &lt;em&gt;will&lt;/em&gt; come in this blog!) they created a WCF service where they could upload an image and request it again, using a WF workflow. In about 38 lines of code, { and } on empty lines included!!!     &lt;br /&gt;    &lt;br /&gt;Courtesy of Paul Gielens, I got the code from his weblog. The following starts a REST enabled WCF Service with a WF Writeline activity. Not a Console.Writeline, but a real WF activity.&lt;/p&gt;  &lt;div style="border-right:#cccccc 1pt solid;padding-right:1pt;border-top:#cccccc 1pt solid;padding-left:1pt;font-size:10pt;background:#f5f5f5;padding-bottom:1pt;overflow:auto;border-left:#cccccc 1pt solid;width:100%;color:black;padding-top:1pt;border-bottom:#cccccc 1pt solid;font-family:lucida console;"&gt;   &lt;p style="margin:0px;"&gt;module Service25 &lt;/p&gt;    &lt;p style="margin:0px;"&gt;{ &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; service Service &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; { &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; operation Echo(str : text) : Text &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .UriTemplate = &lt;span style="color:#a31515;"&gt;&amp;quot;echo/{str}&amp;quot;&lt;/span&gt;; &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteLine { Text = &lt;span style="color:#a31515;"&gt;&amp;quot;Message : &amp;quot;&lt;/span&gt; + str } &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; str; &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; } &lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Debugging&lt;/strong&gt;     &lt;br /&gt;At first I thought this was an awesome code generator. But boy was I wrong. They showed debugging and hitting breakpoints inside the textual DSL!!! The stack and locals windows showed the WCF channels and WF activities active. Can you believe it? Probably not, you just have to watch the stream on Channel9.&lt;/p&gt;  &lt;p&gt;I’m now going to follow Don Box, hold on for more!&lt;/p&gt;  &lt;p&gt;Loving it, loving it, loving it, as Don Box would say!&lt;/p&gt;</description></item></channel></rss>