<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-16766120</id><updated>2026-02-21T01:40:04.241+01:00</updated><title type='text'>Liquid Development</title><subtitle type='html'>The Art of Shaping Software</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default?alt=atom&amp;start-index=26&amp;max-results=25'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>93</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-16766120.post-1038199561299011987</id><published>2007-09-24T11:50:00.001+02:00</published><updated>2007-09-24T11:50:20.501+02:00</updated><title type='text'>Getting Autotest to work on Windows for Ruby projects</title><content type='html'>This seems blogworthy, as I have spent much longer than I wanted to find a solution.&lt;br&gt;&lt;br&gt;I was trying to run autotest - of the zentest package - on a ruby project on windows, but autotest didn&amp;#39;t seem to be able to pick up changes to my files. &lt;br&gt;&lt;br&gt;I will not pretend to have understood exactly what made it work for me, but these are things that I did and that might have helped.&lt;br&gt;&lt;br&gt;Setting the &lt;span style=&quot;font-weight: bold;&quot;&gt;HOME &lt;/span&gt;variable:&lt;br&gt;&lt;br&gt; &lt;span style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;set HOME=&amp;quot;c:\Documents and Settings\my_username_here&amp;quot;&lt;/span&gt;&lt;br style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;&lt;br&gt;moving my project files into a  &lt;span style=&quot;font-weight: bold;&quot;&gt;lib &lt;/span&gt;directory and my test files into a &lt;span style=&quot;font-weight: bold;&quot;&gt;test &lt;/span&gt;directory:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;myproject &lt;/span&gt;&lt;br style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;&lt;span style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;myproject/lib&lt;/span&gt;&lt;br style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;  &lt;span style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;myproject/test&lt;/span&gt;&lt;br style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br&gt;&lt;/span&gt;going to the project directory and running autotest: &lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-weight: bold; background-color: rgb(153, 255, 153);&quot;&gt;cd myproject&lt;br&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;autotest -v&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;background-color: rgb(153, 255, 153);&quot;&gt;&lt;br&gt;This should work. Every time I save a test file or a lib file, autotest picks up the changes and runs the tests. &lt;br&gt;&lt;br&gt;thanks to &lt;a href=&quot;http://ph7spot.com/articles/getting_started_with_autotest&quot; target=&quot;_blank&quot; onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot;&gt;Philippe Hanrigou for pointing out the right heuristics&lt;/a&gt;!&lt;br&gt; &lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/1038199561299011987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/1038199561299011987' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/1038199561299011987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/1038199561299011987'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2007/09/getting-autotest-to-work-on-windows-for.html' title='Getting Autotest to work on Windows for Ruby projects'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-7590239772692189656</id><published>2007-08-06T16:52:00.001+02:00</published><updated>2007-08-06T16:52:24.995+02:00</updated><title type='text'>Year 2012</title><content type='html'>According to the current growth rates in five years we will be able to buy storage for about 30 years of audio/video of our life for 100 euros.&lt;br&gt;It will be cheaper to record everything that happens to us and search it than to take notes or even think that we should be taking notes.&lt;br&gt;&lt;br&gt; How is this going to change how we search/organize information?&lt;br&gt;How is this going to change our sense of identity? &lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/7590239772692189656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/7590239772692189656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/7590239772692189656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/7590239772692189656'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2007/08/year-2012.html' title='Year 2012'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-6256636650087136800</id><published>2007-07-05T01:01:00.001+02:00</published><updated>2007-07-05T01:01:38.168+02:00</updated><title type='text'>Ruby Social Club night</title><content type='html'>The &lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;color: rgb(255, 102, 0);&quot;&gt;Ruby Social Club&lt;/span&gt;&lt;/font&gt; meetups have started and they are coming on one after the other! &lt;br&gt;drop us a call if you are in Italy. We are &lt;font size=&quot;4&quot;&gt;&lt;a href=&quot;http://ruby-it.org/pages/Persone&quot;&gt; all over the place&lt;/a&gt;&lt;/font&gt;, so don&amp;#39;t be shy and get in touch.&lt;br&gt;This is &lt;a href=&quot;http://www.rubysocialclub.net/moin.fcg/serata_businessbase&quot;&gt;a short report&lt;/a&gt; on the evening on the new RSC wiki (thanks &lt;font size=&quot;6&quot;&gt; &lt;a style=&quot;color: rgb(0, 153, 0);&quot; href=&quot;http://tempe.st/&quot;&gt;intinig!&lt;/a&gt;&lt;/font&gt;)&lt;br&gt; &lt;br&gt;the pics are heavy but I didn&amp;#39;t want to spoil them (you&amp;#39;ll see)&lt;br&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/6256636650087136800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/6256636650087136800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/6256636650087136800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/6256636650087136800'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2007/07/ruby-social-club-night.html' title='Ruby Social Club night'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-367442038448315360</id><published>2007-07-04T11:54:00.001+02:00</published><updated>2007-07-04T11:54:17.120+02:00</updated><title type='text'>Are you still reading me?</title><content type='html'>I haven&amp;#39;t been blogging for a long looong time as I have been busy in a number of other activities.&lt;br&gt;Mainly stuff like giving some balance to my life and making up my mind for the next important steps in my life.&lt;br&gt; &lt;br&gt;Apologies to all people I have not been talking to during these months.&amp;nbsp; It just needed to be done.&lt;br&gt;&lt;br&gt;Now I have to decide if I should go on with this blog, wrap everything up and move somewhere-else which is more representative of who I am now and what I want to do. &lt;br&gt;&lt;br&gt;So.. are you guys still reading my blog?&amp;nbsp; Do I still have some readers? Where are you from, what topics yuo would like me to cover?&lt;br&gt;Please, let me know so that I can take a decision.&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/367442038448315360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/367442038448315360' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/367442038448315360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/367442038448315360'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2007/07/are-you-still-reading-me.html' title='Are you still reading me?'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-116064128515640509</id><published>2006-10-12T10:21:00.000+02:00</published><updated>2007-03-27T20:00:06.180+02:00</updated><title type='text'>TheRubyMine is On</title><content type='html'>Finally we did it!  &lt;a href=&quot;http://therubymine.com&quot;&gt;TheRubyMine&lt;/a&gt; is online :-)&lt;br /&gt;The big challenge now is to rally the whole community around it.. any advice on how to build deeper feeling of ownership and participation?&lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/116064128515640509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/116064128515640509'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/10/therubymine-is-on.html' title='TheRubyMine is On'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-115740496036795341</id><published>2006-09-04T23:18:00.000+02:00</published><updated>2007-03-27T20:00:54.366+02:00</updated><title type='text'>The Ruby Mine</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://photos1.blogger.com/blogger/5227/1600/1600/logo.0.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;&quot; src=&quot;http://photos1.blogger.com/blogger/5227/1600/400/logo.0.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Whoa! I can&#39;t believe we are almost there!!!  It took us a while to get our act together but here it is: &lt;a href=&quot;http://www.therubymine.com&quot;&gt;TheRubyMine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The title is in english, but the content will be Italian, for the guys around here :-)&lt;br /&gt;&lt;br /&gt;We are going to go Beta - invitation only in just a few days..&lt;br /&gt;&lt;br /&gt;Check it out.  Leave your mail.  Join the Vision.&lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115740496036795341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115740496036795341'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/09/ruby-mine.html' title='The Ruby Mine'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-115097161681076109</id><published>2006-06-22T12:20:00.000+02:00</published><updated>2006-06-22T12:20:16.903+02:00</updated><title type='text'>NOT Thinking in Java (tm)</title><content type='html'>&lt;span class=&quot;gmail_quote&quot;&gt;It has been some time now that I have been thinking about organizing some &lt;/span&gt;&amp;quot;*Not* Thinking in Java (tm)&amp;quot; workshops.&amp;nbsp; It&#39;s not that I feel any angst towards Java &lt;span style=&quot;font-style: italic;&quot;&gt;  per se&lt;/span&gt;, but attacking Java seems to be the trendy thing to do these days :-)&lt;br&gt; &lt;br&gt; Forget about the Java thing, the sheep-thinking of the object culture is what bothers me.&amp;nbsp; I am not denying my past, since I have also contributed in little part to create it and evangelize it.&amp;nbsp; In the course of the past few years, we have gotten fat with objects and patterns and we have explored the limits of what can be done with objects.&lt;br&gt; &lt;br&gt; That&#39;s the way it had to be, but I think that it is now time to explore alternatives.&lt;span class=&quot;gmail_quote&quot;&gt;&lt;/span&gt;&amp;nbsp; Lisp, Erlang, Haskell and their friends and cousins.&lt;br&gt; &lt;div&gt; &lt;br&gt; Yesterday I saw a &lt;a href=&quot;http://www.defmacro.org/ramblings/fp.html&quot;&gt;nice article on functional languages&lt;/a&gt;.&amp;nbsp; I really liked it.&amp;nbsp; Extremely well written, simple and very pesuasive.&amp;nbsp; Long, but light.&amp;nbsp; I advise eveyone interested in the topic to print it out and read it.&amp;nbsp; It&#39;s amazing how things can be different - and difficult things become easy - once you shift your point of view..&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;/div&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/115097161681076109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/115097161681076109' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115097161681076109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115097161681076109'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/06/not-thinking-in-java-tm.html' title='NOT Thinking in Java (tm)'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-115087702949218503</id><published>2006-06-21T10:03:00.000+02:00</published><updated>2006-06-21T10:03:49.563+02:00</updated><title type='text'>Dojo in Rome</title><content type='html'>My readers will know that we are trying to shake up the italian ruby scene with the Ruby Social Club events.&amp;nbsp; The next meeting in Rome will be hosted by &lt;a href=&quot;http://www.interact.it&quot;&gt;Interact&lt;/a&gt; and we will have a proper conference room with projector, network and big screen.&lt;br&gt; &lt;br&gt; We are thinking about some cool new presentation formats to keep everyone active and entertained.. what about the &lt;a href=&quot;http://www.theserverside.com/blogs/thread.tss?thread_id=40921&quot;&gt;Dojo&lt;/a&gt;?&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/115087702949218503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/115087702949218503' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115087702949218503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115087702949218503'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/06/dojo-in-rome.html' title='Dojo in Rome'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-115029311713909597</id><published>2006-06-14T15:51:00.000+02:00</published><updated>2006-06-14T15:52:09.153+02:00</updated><title type='text'>Invisible Rails Reference Guide</title><content type='html'>Some of my friends know that I have finally decided to start having a look at Rails.&amp;nbsp; I have found &lt;a href=&quot;http://blog.invisible.ch/files/rails-reference-1.1.html&quot;&gt;this fantastic reference guide&lt;/a&gt; by &lt;a href=&quot;http://blog.invisible.ch&quot;&gt; InVisible &lt;/a&gt;that seems to answer all my questions!&lt;br clear=&quot;all&quot;&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/115029311713909597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/115029311713909597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115029311713909597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/115029311713909597'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/06/invisible-rails-reference-guide.html' title='Invisible Rails Reference Guide'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114925326499162953</id><published>2006-06-02T15:01:00.000+02:00</published><updated>2006-06-02T20:37:53.633+02:00</updated><title type='text'>Javascript programming with MozLab</title><content type='html'>Wait a minute, wasn&#39;t javascript a java-like scripting language for browser?  I will not deny that this belief also kept me away from doing any firefox extension development.&lt;br /&gt;&lt;br /&gt;Today I discovered &lt;a href=&quot;http://dev.hyperstruct.net/trac/mozlab&quot;&gt; MozLab&lt;/a&gt; and there is no turning back :-)  You can do ubercool development on the mozilla platform with Repl (a kind of Irb on steroids.. you navigate and manipulate live objects inside the browser!!!)  That&#39;s enough to tempt the Metaprogrammer in me :-)  Then, of course, you have MozUnit for the TDD and agile minded.&lt;br /&gt;&lt;span class=&quot;gmail_quote&quot;&gt;&lt;br /&gt;&lt;/span&gt;I wonder how many other languages are deeply misunderstood out there...&lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114925326499162953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114925326499162953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114925326499162953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114925326499162953'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/06/javascript-programming-with-mozlab.html' title='Javascript programming with MozLab'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114785944099953474</id><published>2006-05-17T11:50:00.000+02:00</published><updated>2006-05-17T11:50:41.056+02:00</updated><title type='text'>On Simplicity and Execution</title><content type='html'>I have recently started to use &lt;a href=&quot;http://del.icio.us/&quot;&gt;delicious&lt;/a&gt;, the social bookmarking system.&amp;nbsp; Today I also found out about delicious networks: you can subscribe to the delicious feeds of a number of users and then see them as a single unified feed.&amp;nbsp; &lt;br&gt; &lt;br&gt; You can also subscribe to individual RSS feeds and be notified when someone you know and trust comes up with a new interesting link.&lt;br&gt; &lt;br&gt; Why am I talking about this?&amp;nbsp; I started thinking about these delicious features because back in 2000/2001 I was thinking about something quite similar from a philosophical point of view.&amp;nbsp; I wanted to have a way to communicate to a network of trusted people the evolution of my interests and how I was structuring the nformation that I was getting from the internet.&amp;nbsp; I was thinking about a complex trust system, modelled using graph theory.&amp;nbsp; I had pieces of news moving across the graph, gaining strength as they received a thumb-up by more and more users.&lt;br&gt; &lt;br&gt; I was theorizing about the rise of &lt;span style=&quot;font-style: italic;&quot;&gt;implicit communities&lt;/span&gt;, ephemeral islands in the net auto-defined by links of mutual trust and common interests.&lt;br&gt; &lt;br&gt; Too much theorizing.&amp;nbsp; There were overwhelming theoretical problems there.&amp;nbsp; How to avoid dangerous trust-feedbacks of information within a network? How should trust be modelled?&amp;nbsp; What are the dimensions of trust?&lt;br&gt; &lt;br&gt; That&#39;s all academic bullshit.&amp;nbsp; &lt;br&gt; &lt;br&gt; Useful for after-the-fact analysis.&amp;nbsp; &lt;br&gt; Useless to get started doing things.&lt;br&gt; &lt;br&gt; Everybody can have a good idea.&amp;nbsp; Ideas have become dead cheap.&lt;br&gt; &lt;br&gt; Good executon means getting the simplest idea and get it implemented and used by people.&amp;nbsp; &lt;br&gt; The rest will follow, if it still makes sense.&lt;br clear=&quot;all&quot;&gt;&lt;br&gt; I need people to shake me every now and again and tell me: &amp;quot;Yes, it&#39;s nice, cool, fantastic! but.. what can we implement and ship right now?&amp;quot;&lt;br&gt; &lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114785944099953474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114785944099953474' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114785944099953474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114785944099953474'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/on-simplicity-and-execution.html' title='On Simplicity and Execution'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114778626425745491</id><published>2006-05-16T15:31:00.000+02:00</published><updated>2006-05-16T15:31:04.316+02:00</updated><title type='text'>Article for Ruby Code &amp; Style</title><content type='html'>I am planning to write an article for &lt;a href=&quot;http://www.artima.com/rubycs&quot;&gt;Ruby Code &amp;amp; Style&lt;/a&gt;, so I ask you, my good readers, what kind of article would you like to see?&lt;br clear=&quot;all&quot;&gt;&lt;br&gt; You can answer in the comments or on kiaroskuro AT gmail DOT com.&lt;br&gt; &lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114778626425745491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114778626425745491' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114778626425745491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114778626425745491'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/article-for-ruby-code-style.html' title='Article for Ruby Code &amp; Style'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114748232652244578</id><published>2006-05-13T03:05:00.000+02:00</published><updated>2006-05-13T03:05:26.583+02:00</updated><title type='text'>Grady Booch</title><content type='html'>Grady Booch announced on his blog that he has health problems and he is going to undergo surgery in the very near future.&amp;nbsp; Grady Booch has been one of my early software heroes and I remember seeing him at OOPSLA back in &#39;97.&amp;nbsp; I wish him all the best. &lt;br clear=&quot;all&quot;&gt;&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114748232652244578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114748232652244578' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114748232652244578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114748232652244578'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/grady-booch.html' title='Grady Booch'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114730559290381761</id><published>2006-05-11T01:46:00.000+02:00</published><updated>2006-05-11T01:59:52.913+02:00</updated><title type='text'>Burnt Out</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://photos1.blogger.com/blogger/5227/1600/1600/images2.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;http://photos1.blogger.com/blogger/5227/1600/320/images2.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;In the course of the past week or so I haven&#39;t been very good at answering to people I am in touch with.  I apologize to you all.  I continuously feel very tired and I needed a bit of a break.&lt;br /&gt;&lt;br /&gt;I have been in touch with so many people recently.. being busy talking, planning and organizing that my body could barely catch up with my activities.&lt;br /&gt;&lt;br /&gt;I now start feeling a bit better and I will &lt;span style=&quot;font-weight: bold;&quot;&gt;slowly&lt;/span&gt; go back to my coding, networking, book writing, socializing, plotting and planning.  My girlfriend might appreciate some of my time too :-)&lt;br /&gt;&lt;br /&gt;I am afraid that if I want to keep up with this rythm I&#39;ll have to take on doing some exercising.  Andrea, a friend of mine, told me that there is a group doing yoga-like practice in the evening in a park just behind the Colosseum.  It sounds good and I might go with him to check it out one of these days.  I have practiced meditation for a while in the past at a Buddhist School in England and I know the value of cultivating a fresh unencumbered centered mind.&lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114730559290381761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114730559290381761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114730559290381761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114730559290381761'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/burnt-out.html' title='Burnt Out'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114730414016504689</id><published>2006-05-11T01:35:00.000+02:00</published><updated>2006-05-11T01:35:40.246+02:00</updated><title type='text'>20th of May Padua Presentation</title><content type='html'>It&#39;s official.&amp;nbsp; I am going to give a talk about ruby to a great bunch of java coders in &lt;a href=&quot;http://www.jugpadova.it/articles/2006/04/30/jug-meeting-28-da-java-a-ruby-e-ritorno&quot;&gt;Padua on the 20th of May&lt;/a&gt;.&lt;br&gt;I feel slightly nervous since it has been a long time since I gave a talk, but I think it&#39;s a great opportunity to get back into shape. &lt;br&gt;&lt;br&gt;I am only afraid that 45 minutes might not be enough to do justice to the language...&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114730414016504689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114730414016504689' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114730414016504689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114730414016504689'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/20th-of-may-padua-presentation.html' title='20th of May Padua Presentation'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114725240116271708</id><published>2006-05-10T11:13:00.000+02:00</published><updated>2006-05-10T11:16:25.023+02:00</updated><title type='text'>Cyc Space</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://photos1.blogger.com/blogger/5227/1600/1600/cycmap.0.gif&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;http://photos1.blogger.com/blogger/5227/1600/400/cycmap.0.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;A Map of the Cyc universe, from &lt;a href=&quot;http://www.opencyc.org/doc/topic_map&quot;&gt;http://www.opencyc.org/doc/topic_map&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114725240116271708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114725240116271708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114725240116271708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114725240116271708'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/cyc-space.html' title='Cyc Space'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114725121243115388</id><published>2006-05-10T10:53:00.000+02:00</published><updated>2006-05-10T10:53:32.476+02:00</updated><title type='text'>OpenCyc Technology - Formalizing Knowledge</title><content type='html'>&lt;div&gt;I have been wanting to blog this for a while now.&amp;nbsp; I should really try to post some of the goodies that I have found on programmable language-resources on the web.&amp;nbsp; I would also like to elicit you guys&amp;nbsp;to point out more sites and libraries, especially if they happen to support a Ruby API :-) &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;a href=&quot;http://www.opencyc.org/&quot;&gt;OpenCyc&lt;/a&gt; is an OSS&amp;nbsp;system that can be used to formalize common sense reasoning within an inference engine.&amp;nbsp; The best thing is the wealth of data that comes with it.&amp;nbsp; &lt;a href=&quot;http://www.opencyc.org/doc&quot;&gt; Here&lt;/a&gt; is the documentation, and a brief summary of its &lt;a href=&quot;http://www.artima.com/forums/flat.jsp?forum=106&amp;amp;thread=50524&quot;&gt;capabilities&lt;/a&gt;.&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;&lt;a href=&quot;http://liquiddevelopment.blogspot.com&quot;&gt; Chiaroscuro&lt;/a&gt; &lt;/div&gt; &lt;div&gt;&lt;br&gt;&amp;nbsp;&lt;/div&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114725121243115388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114725121243115388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114725121243115388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114725121243115388'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/opencyc-technology-formalizing.html' title='OpenCyc Technology - Formalizing Knowledge'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114694558546484820</id><published>2006-05-06T21:59:00.000+02:00</published><updated>2006-05-06T21:59:45.470+02:00</updated><title type='text'>Chiaroscuro Radio</title><content type='html'>I was sure I would have never done it.&amp;nbsp; I would have never posted pictures of my cat, or inflicted my poor taste on my readers.&lt;br&gt;&lt;br&gt;Still, it happened.&amp;nbsp; On the sidebar you can now find a link to Chiaroscuro Radio!&lt;br&gt;&lt;br&gt; My musical taste has been defined at different times as:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;it sounds like they are skinning a poor cat&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;gee, they all sound the same&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;how can you like this stuff?&amp;quot; &lt;br&gt;   &lt;/li&gt;&lt;/ul&gt;  Chiaroscuro Radio has been realized using &lt;a href=&quot;http://www.pandora.com/&quot;&gt;Pandora&lt;/a&gt;, a software that can learn your musical taste.&amp;nbsp; It took a few days, but now it almost always picks songs that I like.&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114694558546484820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114694558546484820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114694558546484820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114694558546484820'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/chiaroscuro-radio.html' title='Chiaroscuro Radio'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114694027448688975</id><published>2006-05-06T20:31:00.000+02:00</published><updated>2006-05-06T20:31:15.553+02:00</updated><title type='text'>Little Boxes in the Spreadsheet</title><content type='html'>Tonight I should make the first release of Littleboxes, a micro-language (API? DSL? Lingo? dunno!) that allows you to use excel as a debugging writeboard from ruby.&lt;br&gt;&lt;br&gt;You will be able to stream out Objects, Structs, Arrays, Strings, Hashes, etc.. to the spreadsheet so that you can better visualize the data you are working on. &lt;br&gt;&lt;br&gt;Is there any feature that might turn out useful to you?&amp;nbsp; I have still got the evening to work on it before releasing the alpha version to the italian ruby community.&amp;nbsp; If you are not on the ruby-it mailing list drop me an email (kiaroskuro AT gmail DOT com) or a comment and I&#39;ll send it to you too. &lt;br&gt;&lt;br&gt;In the meantime I&#39;ll leave you with some words from Littleboxes, a classic by Malvina Reynolds..&lt;br&gt; &lt;br&gt; &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&amp;quot;Little boxes on the hillside,&lt;/span&gt;&lt;br style=&quot;font-style: italic;&quot;&gt;    &lt;span style=&quot;font-style: italic;&quot;&gt;Little boxes made of ticky tacky&lt;/span&gt;&lt;br style=&quot;font-style: italic;&quot;&gt;   &lt;span style=&quot;font-style: italic;&quot;&gt;Little &amp;nbsp;boxes on the hillside,&lt;/span&gt;&lt;br style=&quot;font-style: italic;&quot;&gt;   &lt;span style=&quot;font-style: italic;&quot;&gt;Little boxes all the same,&lt;/span&gt;&lt;br style=&quot;font-style: italic;&quot;&gt;   &lt;span style=&quot;font-style: italic;&quot;&gt;There&#39;s a green one and &amp;nbsp;a pink one&lt;/span&gt;&lt;br style=&quot;font-style: italic;&quot;&gt;   &lt;span style=&quot;font-style: italic;&quot;&gt;And a blue one and a yellow one&lt;/span&gt;&lt;br style=&quot;font-style: italic;&quot;&gt;   &lt;span style=&quot;font-style: italic;&quot;&gt;And they&#39;re all made out of &amp;nbsp;ticky tacky&lt;/span&gt;&lt;br style=&quot;font-style: italic;&quot;&gt;   &lt;span style=&quot;font-style: italic;&quot;&gt;And they all look just the same.&amp;quot;&lt;/span&gt;&lt;br&gt; &lt;/blockquote&gt; &lt;br&gt;and no, Malvina is not talking about Excel cells ;-)&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114694027448688975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114694027448688975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114694027448688975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114694027448688975'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/little-boxes-in-spreadsheet.html' title='Little Boxes in the Spreadsheet'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114686943512369821</id><published>2006-05-06T00:50:00.000+02:00</published><updated>2006-05-06T00:50:35.130+02:00</updated><title type='text'>Refactoring Emphasis in Language</title><content type='html'>Language is one of the most ancient forms of knowledge encoding and transmission, yet we have so little conscious knowledge of how we can use it to achieve the communication that we want.&lt;br&gt;&lt;div align=&quot;justify&quot;&gt;&lt;br&gt;Words are programs, psychoglyphs running into other people&#39;s head. Shaping words means shaping active executable knowledge.&lt;br&gt;&lt;br&gt;While reading &amp;quot; &lt;a href=&quot;http://www.amazon.com/exec/obidos/tg/detail/-/0916990435/103-8458819-7646237?v=glance&quot;&gt;sleight of mouth&lt;/a&gt;&amp;quot; by &lt;a href=&quot;http://www.nlpu.com/&quot;&gt;Robert Dilts&lt;/a&gt;, I found a couple of very interesting concepts. &lt;br&gt;&lt;br&gt;Look at the following sentences and feel the difference, although they have the same informational contant at face value:&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;I want to do X, but I have a problem&lt;/li&gt;&lt;li&gt;I want to do X, and I have a problem &lt;/li&gt;&lt;li&gt;I want to do X, even if I have a problem&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I call &amp;quot;But&amp;quot;, &amp;quot;and&amp;quot; and &amp;quot;even if&amp;quot; &lt;em&gt;&lt;strong&gt;Emphatic Tags&lt;/strong&gt;&lt;/em&gt; and they can be used to move the emphasis between:&lt;/p&gt;&lt;ul&gt; &lt;li&gt;justification, passive stance&lt;/li&gt;&lt;li&gt;equanimity, objective stance&lt;/li&gt;&lt;li&gt;drive, propositive stance&lt;/li&gt;&lt;/ul&gt;&lt;p align=&quot;justify&quot;&gt;You can do a little word magick by restating sentences, while refactoring it for an emphatic change, and throwing them back with a more empowered meaning, &lt;em&gt;even if&lt;/em&gt; you have never tried before.&lt;/p&gt;&lt;p&gt;The other emphasis trick is the enabler/toll stance.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;Read the following and feel the different emotional effect in front of apparently identical information: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;If you feel like putting some effort in it, you can do anything you want&lt;/li&gt;&lt;li&gt;You can do anything you want, if you feel like putting some effort in it &lt;/li&gt;&lt;/ul&gt;&lt;p align=&quot;justify&quot;&gt;The sentence order makes a world of difference. The first part of the sentence sets the context, while the second part clarifies the meaning of the first one.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;The if-opening sentence is a &lt;strong&gt;&lt;em&gt;Toll Sentence&lt;/em&gt;&lt;/strong&gt;. It&#39;s asking you for something, for a precondition, before giving you what you want. It&#39;s even hinting at the fact that you are not doing what is necessary. It feels like you are trying to convince someone of something.&lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;The you-can-opening sentence is an &lt;strong&gt;&lt;em&gt;Enabler Sentence&lt;/em&gt;&lt;/strong&gt;. It offers you a wide range of options: &lt;em&gt;anything you want&lt;/em&gt;, and it then points to the path to go and grab those options. &lt;/p&gt;&lt;p align=&quot;justify&quot;&gt;&lt;br&gt;&lt;/p&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114686943512369821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114686943512369821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114686943512369821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114686943512369821'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/refactoring-emphasis-in-language.html' title='Refactoring Emphasis in Language'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114677176266079314</id><published>2006-05-04T21:42:00.000+02:00</published><updated>2006-05-04T21:42:43.460+02:00</updated><title type='text'>Executable Knowledge</title><content type='html'>&lt;a href=&quot;http://riffraff.blogsome.com/2006/05/04/organizzare-la-conoscenza/&quot;&gt;Gabriele&lt;/a&gt; is quoting from an &lt;a href=&quot;http://www.ecologiadeisitiweb.net/interviste/organizzare-la-conoscenza-intervista-a-luca-rosati&quot;&gt;interview &lt;/a&gt; to Luca Rosati (in italian):&lt;br&gt; &lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p&gt;I realized that too many time we &#39;reinvent the wheel&#39;.&amp;nbsp; More mature disciplines - such as biblioteconomy, but also psycholinguistics and neurosciences - have found a way to deal with this problem several decades ago... &lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;I have to say that I haven&#39;t read the interview yet, but I am still going to comment on this quote.&lt;br&gt;&lt;br&gt;It&#39;s common to hear people complaining about how Computer Science is immature compared to other disciplines, but I don&#39;t sympathise with this point of view.&amp;nbsp; Other disciplines organise knowledge within a specific domain, whereas the domain of software development is the very act of organising knowledge!&amp;nbsp; Executable knowledge, make no mistake, but still knowledge. &lt;br&gt;&lt;br&gt;If you see things from this point of view, software development is a reflective meta-discipline.&amp;nbsp; It&#39;s part of the very core of software development to change itself, its own tools, the way it models itself and the rest of the world.&amp;nbsp; The discipline keeps changing because it&#39;s an highly introspective discipline, more similar to literature in this respect than to engineering.&amp;nbsp; It is a discipline that talks about the world, but that mainly likes to talk about itself to reflect, evolve and change. &lt;br&gt;&lt;br&gt;Software development changes as the world changes, because the way we see the world and organise our knowledge does change.&amp;nbsp; I would find it worrying if it didn&#39;t.&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114677176266079314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114677176266079314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114677176266079314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114677176266079314'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/executable-knowledge.html' title='Executable Knowledge'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114661226533670468</id><published>2006-05-03T01:24:00.000+02:00</published><updated>2006-05-03T01:24:25.413+02:00</updated><title type='text'>Good Hungarian</title><content type='html'>&lt;font size=&quot;2&quot;&gt;&lt;span id=&quot;st&quot; name=&quot;st&quot; class=&quot;st&quot;&gt;We are used to think of hungarian notation as being a bad thing.&amp;nbsp; However, not many people know that what we know as hungarian notation is a perverted version of the original pure and good hungarian notation.&amp;nbsp; Joel Spolsky  &lt;a href=&quot;http://www.joelonsoftware.com/articles/Wrong.html&quot;&gt;talks about that&lt;/a&gt; too.&lt;br&gt;&lt;br&gt;Bad&lt;/span&gt;-&lt;span id=&quot;st&quot; name=&quot;st&quot; class=&quot;st&quot;&gt;hungarian&lt;/span&gt; is when you prefix a variable name with type information&lt;br&gt;&lt;br&gt;eg: &lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp; fWidth = fSize&lt;/font&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;font size=&quot;2&quot;&gt;&lt;br&gt;the &#39;f&#39; simply means float.&amp;nbsp; &lt;br&gt;&lt;br&gt;You can see you have type compatibilty on both sides, but it doesn&#39;t say anything about semantic compatibility. fWidth could be used as a measure expressed in metres, whereas fSize is expressed in feet! &lt;br&gt;&lt;br&gt;&lt;span id=&quot;st&quot; name=&quot;st&quot; class=&quot;st&quot;&gt;Good&lt;/span&gt;-&lt;span id=&quot;st&quot; name=&quot;st&quot; class=&quot;st&quot;&gt;hungarian&lt;/span&gt; is when you prefix a variable name with semantic information&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp; mtrWidth = ftSize&lt;br&gt; &lt;br&gt;OR&lt;br&gt;&lt;br&gt; &lt;/font&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp; metric_width = feet_size&lt;br&gt;&lt;br&gt;you can see immediately that there is a problem there.&amp;nbsp; &lt;br&gt;&lt;br&gt;Both variables are of the same type (Float), yet they have a different meaning.&amp;nbsp; The prefix difference make the error stand out clearly.&lt;br&gt;&lt;br&gt;This is very useful in general, but I would argue that in ruby - with the dynamism offered by duck typing - good hungarian is very useful and we already use, without even thinking about it. &lt;br clear=&quot;all&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114661226533670468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114661226533670468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114661226533670468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114661226533670468'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/good-hungarian.html' title='Good Hungarian'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114660382144858232</id><published>2006-05-02T23:03:00.000+02:00</published><updated>2006-05-02T23:03:41.493+02:00</updated><title type='text'>Metaprogramming your Breakfast</title><content type='html'>Following on from the &lt;a href=&quot;http://liquiddevelopment.blogspot.com/2006/04/way-of-meta-part-iv-hijacking-local.html&quot;&gt;metaprogramming breakfast&lt;/a&gt;, I think someone is meta-challenging me &lt;a href=&quot;http://riffraff.blogsome.com/2006/05/02/metaprogramming-breakfast/&quot;&gt; here&lt;/a&gt; :-)&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114660382144858232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114660382144858232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114660382144858232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114660382144858232'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/05/metaprogramming-your-breakfast.html' title='Metaprogramming your Breakfast'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114631722061726022</id><published>2006-04-29T15:27:00.000+02:00</published><updated>2006-04-29T15:27:01.563+02:00</updated><title type='text'>Twisting and Shaping DSLs using Ruby Metaprogramming</title><content type='html'>I write this in response to Federico Feroldi&#39;s comment to &lt;a href=&quot;http://liquiddevelopment.blogspot.com/2006/04/way-of-meta-part-iv-hijacking-local.html&quot;&gt;my previous post on defining simple DSLs&lt;/a&gt;.&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex; font-style: italic; color: rgb(102, 0, 204);&quot; class=&quot;gmail_quote&quot;&gt; &lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;[..] while reading your article I was thinking about using the recipe name string as an object to route the messages coming from the ingredients and then catching them by implementing missing_method in the string object... &lt;/span&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt;&lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;So, for:&lt;/span&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt; &lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;recipe &amp;quot;italian breakfast&amp;quot; do&lt;/span&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt;&lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;&amp;nbsp;&amp;nbsp;  caffe = 1, :macchiato&lt;/span&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt; &lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;end&lt;/span&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt;&lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;is there a way to translate it into:&lt;/span&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt; &lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt;&lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;&amp;quot;italian breakfast&amp;quot;.caffe(1, :macchiato) ?&lt;/span&gt;&lt;br style=&quot;color: rgb(102, 102, 102);&quot;&gt;&lt;span style=&quot;color: rgb(102, 102, 102);&quot;&gt;[..] &lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;Let&#39;s see:&lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 255); font-family: courier new,monospace;&quot;&gt; &amp;quot;italian breakfast&amp;quot;.caffe 1, :macchiato&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;First of all, I removed the brackets because I don&#39;t believe in brackets :-)&lt;br&gt;&lt;br&gt;What Federico proposes can be done, but I am not sure I would do it this way, unless I am working&amp;nbsp;  &lt;span style=&quot;font-weight: bold;&quot;&gt;only &lt;/span&gt;within the context of a DSL.&amp;nbsp; If you want your recipe-string to accept the &lt;span style=&quot;font-style: italic;&quot;&gt;caffe&lt;/span&gt; method, then you have to override the &lt;span style=&quot;font-style: italic;&quot;&gt; method_missing&lt;/span&gt; method of the String class, which can be a dangerous thing to do if you have loaded other meta-code that overrides this method on a String or Object level. &lt;br&gt;&lt;br&gt;I would rather go for a &lt;span style=&quot;font-weight: bold;&quot;&gt; Concept Wrap Up&lt;/span&gt;: &lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(51, 51, 255);&quot;&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;Recipe&lt;/span&gt;(&amp;quot;italian breakfast&amp;quot;).caffe&amp;nbsp; 1, :macchiato&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(51, 51, 255);&quot;&gt;&lt;/blockquote&gt;&lt;br&gt;where I make explicit the meaning of &#39;italian breakfast&#39; by wrapping it into a Recipe object.&amp;nbsp; Note that I did not use Recipe. &lt;span style=&quot;font-style: italic;&quot;&gt;new&lt;/span&gt;.&amp;nbsp; I am launching a campaign against the use of &lt;span style=&quot;font-style: italic;&quot;&gt;new&lt;/span&gt; in application code, which I consider at the same level of badly used hungarian notation (because  &lt;span style=&quot;font-weight: bold;&quot;&gt;there is&lt;/span&gt; such a thing as &lt;a href=&quot;http://www.joelonsoftware.com/articles/Wrong.html&quot;&gt;good hungarian notation&lt;/a&gt;).&lt;br&gt;&lt;br&gt;Another way I would do it is by using what I call a &lt;span style=&quot;font-weight: bold;&quot;&gt; Conjunction&lt;/span&gt;:&lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 255); font-family: courier new,monospace;&quot;&gt; &amp;quot;italian breakfast&amp;quot;.&lt;span style=&quot;font-weight: bold;&quot;&gt;consists_of&lt;/span&gt;.caffe&amp;nbsp; 1, :macchiato&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;You will have to inject a &lt;span style=&quot;font-style: italic;&quot;&gt;consists_of&lt;/span&gt; method in the String class, which will act as a conjunction between the String and the method call.&amp;nbsp; The conjunction will take the String and wrap it up in a Recipe object.&amp;nbsp; The cafe method is then invoked on the Recipe object. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;In both cases we have moved the handling of the &lt;span style=&quot;font-style: italic;&quot;&gt;method_missing&lt;/span&gt; from String to a custom made Recipe class.&lt;br&gt;&lt;br&gt;The conjunction will be:&lt;br&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex; font-family: courier new,monospace;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: blue;&quot;&gt;String&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; color: rgb(0, 127, 0);&quot;&gt;#Recipe conjuction&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;consists_of &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;Recipe &lt;b&gt;.&lt;/b&gt;new&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;self&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt; &lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;        &lt;br&gt;The Recipe will start as:&lt;br&gt;&lt;br&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: blue;&quot;&gt;Recipe&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt; initialize&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;recipe_name&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(176, 0, 128);&quot;&gt;@name&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; =&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;recipe_name&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(176, 0, 128);&quot;&gt;@ingredients&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; =&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;{}&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;register_with_global_repository&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&amp;nbsp;&lt;span style=&quot;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt; method_missing&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;method&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; *&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(176, 0, 128);&quot;&gt;@ingredients&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;method&lt;b&gt; .&lt;/b&gt;to_s&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;=&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; args&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; end&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;/blockquote&gt;                      &lt;br&gt;The method_missing is catching the ingredients and it stacks them nicely on an hashtable.&amp;nbsp; Why do we need the &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; register_with_global_repository call, though?&lt;br&gt;&lt;br&gt;Since we are working with a DSL and we are not explicitly storing a reference to a created recipes in a variable, then we get the Recipe to self-register itself with a global centralized repository.&amp;nbsp; I could have made it a  &lt;span style=&quot;font-style: italic;&quot;&gt;@@all_recipes&lt;/span&gt; class attribute, but I think that in this simple example it looks clearer as an external separate entity:&lt;br&gt;&lt;br&gt;&lt;/span&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: purple; font-family: Verdana;&quot;&gt; $RECIPES_REPOSITORY&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black; font-family: Verdana;&quot;&gt;=&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black; font-family: Verdana;&quot;&gt;{}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: blue; font-family: Verdana;&quot;&gt; Recipe&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: blue; font-family: Verdana;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;…&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black; font-family: Verdana;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127); font-family: Verdana;&quot;&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127); font-family: Verdana;&quot;&gt; register_with_global_repository&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt;&lt;span style=&quot;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: purple; font-family: Verdana;&quot;&gt;$RECIPES_REPOSITORY&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black; font-family: Verdana;&quot;&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(176, 0, 128); font-family: Verdana;&quot;&gt; @name&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black; font-family: Verdana;&quot;&gt;]&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black; font-family: Verdana;&quot;&gt; =&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127); font-family: Verdana;&quot;&gt;self&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127); font-family: Verdana;&quot;&gt;end&lt;/span&gt; &lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray; font-family: Verdana;&quot;&gt;&lt;span style=&quot;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127); font-family: Verdana;&quot;&gt;end&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;                    and finally the code to print out the recipe:&lt;br&gt;&lt;br&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt; class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: blue;&quot;&gt;Recipe&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: blue;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;…&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt; def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 127, 127);&quot;&gt;report&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 127);&quot;&gt;&amp;quot;to make #{@name} you should buy:&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(176, 0, 128);&quot;&gt;@ingredients.each_pair&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt; do&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;|&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;ingredient&lt;b&gt;,&lt;/b&gt;description&lt;b&gt;|&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 0, 127);&quot;&gt;&amp;quot; * #{Array(description).join &#39; &#39;} #{ingredient}&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;…&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt; end&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;                          &lt;br&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;What is still missing is a method to print out the recipe directly from the DSL.&amp;nbsp; We would like our call to look like this:&lt;br&gt;&lt;/span&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex; font-family: courier new,monospace;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; recipe?&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(127, 0, 127);&quot;&gt;&amp;quot;italian breakfast&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;br&gt;This snippet fully satisfies our language choice:&lt;br&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;recipe?&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; recipe_name&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: purple;&quot;&gt; $RECIPES_REPOSITORY&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;recipe_name&lt;b&gt;].&lt;/b&gt;report&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt; &lt;b style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;      Our new DSL now allows us to write:&lt;br&gt;&lt;br&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(127, 0, 127);&quot;&gt; &amp;quot;italian breakfast&amp;quot;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;consists_of&lt;b&gt;.&lt;/b&gt;caffe&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;1&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(192, 160, 48);&quot;&gt; :macchiato&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: courier new,monospace; color: black;&quot;&gt;recipe?&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: courier new,monospace; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: courier new,monospace; color: rgb(127, 0, 127);&quot;&gt;&amp;quot;italian breakfast&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;    and to obtain:&lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;to make italian breakfast you should buy: &lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 1 macchiato caffe&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;The one big limitation is that at the moment you can define recipes with only one ingredient.&lt;br&gt; &lt;br&gt;We get around this limitation by making the &lt;span style=&quot;font-style: italic;&quot;&gt;method_missing&lt;/span&gt; a &lt;span style=&quot;font-weight: bold;&quot;&gt;Follow Up Method Chain&lt;/span&gt;:&lt;br&gt;&lt;br&gt;    &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 127, 127);&quot;&gt; allow_method_chaining&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt; self&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt; &lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 127, 127);&quot;&gt; method_missing&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;method&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;*&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(176, 0, 128);&quot;&gt;@ingredients &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;method&lt;b&gt;.&lt;/b&gt;to_s&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt;=&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt; args&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: black;&quot;&gt; allow_method_chaining&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &lt;/span&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; font-family: Verdana; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;          The trick here is that after having defined an ingredients we still have the original Recipe object ready to accept new ingredients.&lt;br&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;&lt;br&gt;You can now do:&lt;br&gt;&lt;br&gt;&lt;/span&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex; font-family: courier new,monospace;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(127, 0, 127);&quot;&gt; &amp;quot;italian breakfast&amp;quot;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;consists_of&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;caffe&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;1&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(192, 160, 48);&quot;&gt;:macchiato&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; ).&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot; lang=&quot;IT&quot;&gt; cornetto&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot; lang=&quot;IT&quot;&gt;1&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot; lang=&quot;IT&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot; lang=&quot;IT&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(192, 160, 48);&quot; lang=&quot;IT&quot;&gt;:cioccolato&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot; lang=&quot;IT&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot; lang=&quot;IT&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot; lang=&quot;IT&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot; lang=&quot;IT&quot;&gt;recipe?&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot; lang=&quot;IT&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(127, 0, 127);&quot; lang=&quot;IT&quot;&gt;&amp;quot;italian breakfast&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot; lang=&quot;IT&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;          &lt;br&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;and get:&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 153, 0);&quot;&gt; to make italian breakfast you should buy:&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 1 cioccolato cornetto&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 153, 0);&quot;&gt; &amp;nbsp;* 1 macchiato caffe&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;&lt;br&gt;&lt;br&gt;That was long! I think I will now go for a &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 153, 0);&quot;&gt; 1 cioccolato cornetto&lt;/span&gt;!&lt;br&gt;&lt;br&gt;&lt;/span&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114631722061726022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114631722061726022' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114631722061726022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114631722061726022'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/04/twisting-and-shaping-dsls-using-ruby.html' title='Twisting and Shaping DSLs using Ruby Metaprogramming'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16766120.post-114625499134771919</id><published>2006-04-28T22:09:00.000+02:00</published><updated>2006-04-28T22:09:51.396+02:00</updated><title type='text'>The Way of Meta - Part IV - Hijacking Local Variables in DSLs</title><content type='html'>&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 6pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-size: 18pt; font-family: &#39;Comic Sans MS&#39;;&quot; lang=&quot;EN-GB&quot;&gt;The Way of &lt;/span&gt;&lt;span style=&quot;font-size: 18pt; font-family: &#39;Comic Sans MS&#39;;&quot; lang=&quot;EN-GB&quot;&gt;  Meta&lt;/span&gt;&lt;span style=&quot;font-size: 18pt; font-family: &#39;Comic Sans MS&#39;;&quot; lang=&quot;EN-GB&quot;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 6pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: &#39;Comic Sans MS&#39;;&quot;&gt; ~&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 6pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: &#39;Comic Sans MS&#39;;&quot; lang=&quot;EN-GB&quot;&gt;V. 0.0.4&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 6pt; text-align: center;&quot; align=&quot;center&quot;&gt; &lt;span style=&quot;font-size: 10pt; font-family: &#39;Comic Sans MS&#39;;&quot; lang=&quot;EN-GB&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;Not long ago I have read the &#39;&lt;a href=&quot;http://www.artima.com/rubycs/articles/ruby_as_dsl.html&quot;&gt;Creating DSLs with Ruby&lt;/a&gt;&#39; article written by Jim Freeze, where he explains how to forge a  &lt;a href=&quot;http://www.oreillynet.com/ruby/blog/2005/12/what_is_a_dsl.html&quot;&gt;DSL&lt;/a&gt; step by step, creating a new human readable formalism on top of ruby.&amp;nbsp; I really enjoyed the article as it went along some of the lines of thought that I have been working on for a while. &lt;br&gt;&lt;br&gt;In the article there was a point that was left somewhat open: how to allow developers using a DSL to assign values to new concepts that they define on the spot, and then get access to both these concepts and their values from within the DSL. &lt;br&gt;&lt;br&gt;I realize I have been a bit vague here, so I&#39;ll give you a straightforward example.&amp;nbsp; Let&#39;s say we want to define a DSL to describe the shopping list with all the ingredients needed to make a certain recipe..&lt;br&gt;&lt;br&gt; Ideally we would like to write something like:&lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt; shopping_list_for &amp;quot;BLT sandwiches for the picnic&amp;quot; do&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; sliced_bread = 3 &lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; lettuce = 2&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt; &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; tomatoes = 6, :red&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt; &amp;nbsp; bacon = 4&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;end&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;The do..end block delimits a block context that gets passed directly to the  &lt;span style=&quot;color: rgb(0, 0, 153);&quot;&gt;shopping_list_for&lt;/span&gt; method.&lt;br&gt;This method should then extract the various ingredients and their quantity and description.&lt;br&gt;&lt;br&gt;How can it do that?&amp;nbsp; One way is to run the block within a context where those ingredients already exist as methods.&amp;nbsp; This context would be a class with -for example- the  &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;sliced_bread=&lt;/span&gt; method overridden to accept the DSL input.&lt;br&gt;&lt;br&gt;What about new ingredients that have not been specified &lt;span style=&quot;font-style: italic;&quot;&gt; a priori&lt;/span&gt; ?&amp;nbsp; Your metaprogramming instincts will tell you to go for a method_missing based technique.&amp;nbsp; Wrong.&amp;nbsp; Unless you specify a self (or other object) in front of &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt; sliced_bread&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 153);&quot;&gt;&lt;/span&gt;, ruby will simply assume that it is a local variable rather than a missing method.&amp;nbsp; Highly annoying if you ask me, but it is necessary to avoid even worst problems and ambiguities when dealing with stuff like mixins. &lt;br&gt;&lt;br&gt;You are left with these three choices:&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;shopping_list_for &amp;quot;BLT sandwiches for the picnic&amp;quot; do &lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; self.sliced_bread = 3&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; self.lettuce = 2&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; self.tomatoes = 6, :red&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; self.bacon = 4&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;end&lt;/span&gt;&lt;br&gt; &lt;/blockquote&gt; &lt;br&gt;Argh!&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;shopping_list_for &amp;quot;BLT sandwiches for the picnic&amp;quot; do |recipe| &lt;/span&gt; &lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; recipe.sliced_bread = 3&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;recipe.&lt;/span&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt; lettuce = 2&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;recipe.&lt;/span&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt; tomatoes = 6, :red&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;recipe.&lt;/span&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt; bacon = 4&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;end&lt;/span&gt;&lt;br&gt; &lt;/blockquote&gt; &lt;br&gt;Just a tad annoying&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;shopping_list_for &amp;quot;BLT sandwiches for the picnic&amp;quot; do &lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; @sliced_bread = 3&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; @lettuce = 2&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; @tomatoes = 6, :red&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; @bacon = 4&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;end&lt;/span&gt;&lt;br&gt; &lt;/blockquote&gt; &lt;br&gt;The best so far.. you can visualize the @ as bullet points ant it is &lt;span style=&quot;font-style: italic;&quot;&gt;kind of&lt;/span&gt; ok.. &lt;br&gt;Kind of.&lt;br&gt;&lt;br&gt;Jim, at this point, proposes to drop the equal sign to force ruby to recognize the new keyword as a method that gets routed through method_missing. &lt;br&gt;&lt;br&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;shopping_list_for &amp;quot;BLT sandwiches for the picnic&amp;quot; do &lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; sliced_bread 3&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; lettuce 2&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; tomatoes 6, :red&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; bacon 4&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;end&lt;/span&gt;&lt;br&gt; &lt;/blockquote&gt;  &lt;br&gt;I&#39;ll admit it, this is not bad at all.&amp;nbsp; Yet it annoys me to no end that I cannot just get those variables that I need from another context.&lt;br&gt;&lt;br&gt;Thinking about there is a way to get variables, and that is the &lt;span style=&quot;font-style: italic;&quot;&gt; local_variables&lt;/span&gt; method, but you have to execute it within a specific context.&amp;nbsp; There is also a method to pass around contexts, and that is &lt;span style=&quot;font-style: italic;&quot;&gt;binding&lt;/span&gt;.&amp;nbsp; What we have to do is to get the binding of the block and to get the local variables within the context underlying the binding. &lt;br&gt;&lt;br&gt;I tried to call the block and then get the binding of the block, but it didn&#39;t work.&amp;nbsp; The block gets executed and the variables fall out of scope and become unavailable.&amp;nbsp; &lt;br&gt;&lt;br&gt;I had to get the block itself to return the binding.&amp;nbsp; This can be done and it works, but the binding looks totally out of place.. &lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;shopping_list_for &amp;quot;BLT sandwiches for the picnic&amp;quot; do &lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; sliced_bread = 3&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; lettuce = 2&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; tomatoes = 6, :red&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; bacon = 4&lt;/span&gt;&amp;nbsp; &lt;br&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt; &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt; &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; binding&lt;/span&gt; &lt;br&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt; &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;end&lt;/span&gt;&lt;br&gt; &lt;/blockquote&gt; &lt;br&gt;Here it hit me that I could alias the word &lt;span style=&quot;font-style: italic;&quot;&gt;binding&lt;/span&gt; to something that would look good with end.&amp;nbsp; What about &lt;span style=&quot;font-style: italic;&quot;&gt;the end&lt;/span&gt; ?&amp;nbsp; I know it&#39;s tacky, but in its own tacky way it works and sounds credible: &lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;shopping_list_for &amp;quot;BLT sandwiches for the picnic&amp;quot; do &lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; sliced_bread = 3&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; lettuce = 2&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; tomatoes = 6, :red&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;   &lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;&amp;nbsp; bacon = 4&lt;/span&gt;&amp;nbsp; &lt;br&gt; &lt;/blockquote&gt; &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace; color: rgb(0, 0, 153);&quot;&gt;the end&lt;/span&gt;&lt;br&gt;  &lt;/blockquote&gt;  &lt;br&gt;This is the code that allows the DSL to work and to print out the shopping list:&lt;br&gt;&lt;br&gt;  &lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; def&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;report&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; recipe&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;ingredients&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; color: rgb(127, 0, 127);&quot;&gt; &amp;quot;to make #{recipe} you should buy:&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;ingredients&lt;b&gt;.&lt;/b&gt;each_pair&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; do&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;|&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;ingredient&lt;b&gt;,&lt;/b&gt;description&lt;b&gt;|&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt; &lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;puts&lt;/span&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; color: rgb(127, 0, 127);&quot;&gt;&amp;quot; * #{Array(description).join &#39; &#39;} #{ingredient}&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt; &lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;br&gt;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;def &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;shopping_list&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; recipe&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;shopping_binding&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;=&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;yield&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;ingredients&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; =&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;{}&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;eval&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; color: rgb(127, 0, 127);&quot;&gt;&amp;quot;local_variables&amp;quot; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;shopping_binding&lt;b&gt;).&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;each &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;do&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; |&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;var&lt;b&gt;|&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;ingredients&lt;b&gt;[&lt;/b&gt;var&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;=&lt;/span&gt; &lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;eval&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; color: rgb(127, 0, 127);&quot;&gt;&amp;quot;#{var}&amp;quot; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;shopping_binding&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt; end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;report&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;recipe&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;ingredients&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;alias&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;the&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;binding&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;br&gt; &amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;shopping_list&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; color: rgb(127, 0, 127);&quot;&gt; &amp;quot;english breakfast&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;do&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;tomatoes&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; =&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;2&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(192, 160, 48);&quot;&gt;:green&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;sausages&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;=&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;eggs&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;=&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;2&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(192, 160, 48);&quot;&gt; :big&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;bacon&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;=&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt; &lt;blockquote&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;shopping_list&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; color: rgb(127, 0, 127);&quot;&gt;&amp;quot;banana milkshake&amp;quot;&lt;/span&gt; &lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;do&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;milk&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; =&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;bananas&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt; =&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 127, 127);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;font-family: courier new,monospace;&quot;&gt; &lt;font size=&quot;1&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black;&quot;&gt;the&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(0, 0, 127);&quot;&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 10pt; color: gray;&quot;&gt; &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;                                                                              &lt;br&gt;When you run it you get:&lt;br&gt;&lt;br&gt;&lt;blockquote style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot; class=&quot;gmail_quote&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;to make english breakfast you should buy: &lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 2 green tomatoes&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 3 sausages&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 4 bacon&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 2 big eggs&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt; to make banana milkshake you should buy:&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 2 bananas&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;nbsp;* 1 milk&lt;/span&gt; &lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;div class=&quot;blogger-post-footer&quot;&gt;       Liquid Development 
-- The Art of Shaping Software --
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://liquiddevelopment.blogspot.com/feeds/114625499134771919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/16766120/114625499134771919' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114625499134771919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16766120/posts/default/114625499134771919'/><link rel='alternate' type='text/html' href='http://liquiddevelopment.blogspot.com/2006/04/way-of-meta-part-iv-hijacking-local.html' title='The Way of Meta - Part IV - Hijacking Local Variables in DSLs'/><author><name>kia</name><uri>http://www.blogger.com/profile/05750239458663051981</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>