<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Bamboozled</title>
  <link rel="alternate" type="text/html" href="http://bamboo.github.com/" />
  <link rel="self" type="application/atom+xml" href="http://bamboo.github.com/atom.xml" />
  <id>http://bamboo.github.com/atom.xml</id>
  <updated>2014-02-01T04:17:11-08:00</updated>
  
  <author>
      <name>Rodrigo B. de Oliveira</name>
      <uri>http://bamboo.github.com</uri>
      <email>rbo@acm.org</email>
  </author>


  
  <entry>
    <title>boo metaprogramming facilities I - the ast</title>
    <link rel='alternate' type='text/html' href='http://bamboo.github.com/2010/07/11/boo-meta-programming-facilities-I-the-ast.html' />
    <id>tag:bamboo.github.com:/2010/07/11/boo-meta-programming-facilities-I-the-ast</id>
    <updated>2010-07-11T00:00:00-07:00</updated>
    <summary><p>The boo compiler follows the common design of internally representing code using what’s usually called a heterogeneous abstract syntax tree, ast for short. Code constructs such as class and method definitions, if and while statements, references and all sorts of expressions are represented by specific concrete types such as <em>ClassDefinition</em>, <em>Method</em>, <em>IfStatement</em>, <em>WhileStatement</em>, <em>ReferenceExpression</em>, etc.</p>

<p>In other words, given an arbitrary fragment of boo code:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
      <span class='k'>return</span> <span class='mi'>42</span>
</code></pre></div>
<p>Its internal representation can be obtained through the chained instantiation of the right ast types:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span>
    <span class='n'>fragment</span> <span class='o'>=</span> <span class='n'>Method</span><span class='p'>(</span><span class='n'>Name</span><span class='p'>:</span> <span class='s2'>&quot;ltuae&quot;</span><span class='p'>,</span> <span class='n'>Body</span><span class='p'>:</span> <span class='n'>Block</span><span class='p'>(</span><span class='n'>ReturnStatement</span><span class='p'>(</span><span class='n'>IntegerLiteralExpression</span><span class='p'>(</span><span class='mi'>42</span><span class='p'>))))</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p>Such an approach to ast construction however fundamental might lead very rapidly to unintelligible code so boo provides a more natural way of constructing and manipulating ast fragments through the use of <em>code literals</em>:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>fragment</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span>
      <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
        <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p><em>[|</em> and <em>|]</em> are the quasi-quotation markers and they instruct the compiler to produce the proper ast instantiation chain for the delimited code.</p>

<p>They can be used with expressions:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>expression</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> <span class='n'>question</span> <span class='ow'>is</span> <span class='n'>ltuae</span> <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>expression</span><span class='p'>.</span><span class='n'>Operator</span>         <span class='c1'># ReferenceEquality</span>
    <span class='nb'>print</span> <span class='n'>expression</span><span class='p'>.</span><span class='n'>Left</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span>   <span class='c1'># ReferenceExpression</span>
    <span class='nb'>print</span> <span class='n'>expression</span><span class='p'>.</span><span class='n'>Right</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span>  <span class='c1'># ReferenceExpression</span>
</code></pre></div>
<p>They can be used with statements:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>statement</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> 
      <span class='k'>if</span> <span class='n'>question</span> <span class='ow'>is</span> <span class='n'>ltuae</span><span class='p'>:</span>
        <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>statement</span><span class='p'>.</span><span class='n'>Condition</span> <span class='c1'># (question is ltuae)</span>
</code></pre></div>
<p>As well as with complete type definitions:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>type</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span>
      <span class='k'>class</span> <span class='nc'>BigThinker</span><span class='p'>:</span>
        <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
          <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='k'>for</span> <span class='n'>member</span> <span class='ow'>in</span> <span class='n'>type</span><span class='p'>.</span><span class='n'>Members</span><span class='p'>:</span>
      <span class='nb'>print</span> <span class='n'>member</span><span class='p'>.</span><span class='n'>Name</span>
</code></pre></div>
<p>Code literals also provide for a simple way of assembling larger code structures out of smaller fragments:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>def</span> <span class='nf'>bigThinkerOf</span><span class='p'>(</span><span class='n'>thought</span> <span class='k'>as</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span><span class='p'>.</span><span class='n'>Expression</span><span class='p'>):</span>
      <span class='k'>return</span> <span class='p'>[</span><span class='o'>|</span>
        <span class='k'>class</span> <span class='nc'>BigThinker</span><span class='p'>:</span>
          <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
            <span class='k'>return</span> <span class='err'>$</span><span class='n'>thought</span>
      <span class='o'>|</span><span class='p'>]</span>
        
    <span class='k'>for</span> <span class='n'>member</span> <span class='ow'>in</span> <span class='n'>bigThinkerOf</span><span class='p'>([</span><span class='o'>|</span> <span class='mi'>42</span> <span class='o'>|</span><span class='p'>]).</span><span class='n'>Members</span><span class='p'>:</span>
      <span class='nb'>print</span> <span class='n'>member</span><span class='p'>.</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p><em>$</em> is the splicing operator and it instructs the compiler to inject the marked expression into the ast instantiation chain.</p>

<p>Primitive values can also be spliced in:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>primitive</span> <span class='o'>=</span> <span class='mi'>42</span>
    <span class='n'>fragment</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> <span class='err'>$</span><span class='n'>primitive</span> <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span> <span class='c1'># IntegerLiteralExpression</span>
</code></pre></div>
<p>Getting an ast fragment out of a primitive value is called <em>lifting</em> and can be more directly achieved through one of the many <em>Expression.Lift</em>, <em>Statement.Lift</em> and <em>TypeReference.Lift</em> overloads:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>fragment</span> <span class='o'>=</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span><span class='p'>.</span><span class='n'>Expression</span><span class='p'>.</span><span class='n'>Lift</span><span class='p'>(</span><span class='mi'>42</span><span class='p'>)</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span> <span class='c1'># IntegerLiteralExpression</span>
</code></pre></div>
<p>Complex expressions can be spliced in but must be parenthesized for disambiguation:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>primitive</span> <span class='o'>=</span> <span class='mi'>42</span>
    <span class='n'>fragment</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> <span class='err'>$</span><span class='p'>(</span><span class='n'>primitive</span><span class='p'>.</span><span class='n'>ToString</span><span class='p'>())</span> <span class='o'>|</span><span class='p'>]</span> <span class='c1'># in contrast to [| $primitive.ToString() |] </span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span> <span class='c1'># StringLiteralExpression</span>
</code></pre></div>
<p>And finally an ast fragment can be compiled into runnable code using one of the <em>compile</em> primitives available in the <em>Boo.Lang.Compiler.MetaProgramming</em> namespace:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>MetaProgramming</span>
    
    <span class='n'>ast</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span>
      <span class='k'>class</span> <span class='nc'>BigThinker</span><span class='p'>:</span>
        <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
          <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='n'>type</span> <span class='o'>=</span> <span class='n'>compile</span><span class='p'>(</span><span class='n'>ast</span><span class='p'>)</span>
    <span class='n'>instance</span> <span class='k'>as</span> <span class='n'>duck</span> <span class='o'>=</span> <span class='n'>type</span><span class='p'>()</span> <span class='c1'># duck typing to the rescue</span>
    <span class='nb'>print</span> <span class='n'>instance</span><span class='p'>.</span><span class='n'>ltuae</span><span class='p'>()</span>
</code></pre></div>
<p>Runtime code generation is a useful technique but most really interesting metaprogramming opportunities manifest themselves at compile time through one of the extension points provided by boo: attributes, macros, metafunctions and the compilation pipeline which shall all be covered next.</p></summary>
    <content type='html' xml:lang='en' xml:base='http://bamboo.github.com'><p>The boo compiler follows the common design of internally representing code using what’s usually called a heterogeneous abstract syntax tree, ast for short. Code constructs such as class and method definitions, if and while statements, references and all sorts of expressions are represented by specific concrete types such as <em>ClassDefinition</em>, <em>Method</em>, <em>IfStatement</em>, <em>WhileStatement</em>, <em>ReferenceExpression</em>, etc.</p>

<p>In other words, given an arbitrary fragment of boo code:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
      <span class='k'>return</span> <span class='mi'>42</span>
</code></pre></div>
<p>Its internal representation can be obtained through the chained instantiation of the right ast types:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span>
    <span class='n'>fragment</span> <span class='o'>=</span> <span class='n'>Method</span><span class='p'>(</span><span class='n'>Name</span><span class='p'>:</span> <span class='s2'>&quot;ltuae&quot;</span><span class='p'>,</span> <span class='n'>Body</span><span class='p'>:</span> <span class='n'>Block</span><span class='p'>(</span><span class='n'>ReturnStatement</span><span class='p'>(</span><span class='n'>IntegerLiteralExpression</span><span class='p'>(</span><span class='mi'>42</span><span class='p'>))))</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p>Such an approach to ast construction however fundamental might lead very rapidly to unintelligible code so boo provides a more natural way of constructing and manipulating ast fragments through the use of <em>code literals</em>:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>fragment</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span>
      <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
        <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p><em>[|</em> and <em>|]</em> are the quasi-quotation markers and they instruct the compiler to produce the proper ast instantiation chain for the delimited code.</p>

<p>They can be used with expressions:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>expression</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> <span class='n'>question</span> <span class='ow'>is</span> <span class='n'>ltuae</span> <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>expression</span><span class='p'>.</span><span class='n'>Operator</span>         <span class='c1'># ReferenceEquality</span>
    <span class='nb'>print</span> <span class='n'>expression</span><span class='p'>.</span><span class='n'>Left</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span>   <span class='c1'># ReferenceExpression</span>
    <span class='nb'>print</span> <span class='n'>expression</span><span class='p'>.</span><span class='n'>Right</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span>  <span class='c1'># ReferenceExpression</span>
</code></pre></div>
<p>They can be used with statements:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>statement</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> 
      <span class='k'>if</span> <span class='n'>question</span> <span class='ow'>is</span> <span class='n'>ltuae</span><span class='p'>:</span>
        <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>statement</span><span class='p'>.</span><span class='n'>Condition</span> <span class='c1'># (question is ltuae)</span>
</code></pre></div>
<p>As well as with complete type definitions:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>type</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span>
      <span class='k'>class</span> <span class='nc'>BigThinker</span><span class='p'>:</span>
        <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
          <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='k'>for</span> <span class='n'>member</span> <span class='ow'>in</span> <span class='n'>type</span><span class='p'>.</span><span class='n'>Members</span><span class='p'>:</span>
      <span class='nb'>print</span> <span class='n'>member</span><span class='p'>.</span><span class='n'>Name</span>
</code></pre></div>
<p>Code literals also provide for a simple way of assembling larger code structures out of smaller fragments:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>def</span> <span class='nf'>bigThinkerOf</span><span class='p'>(</span><span class='n'>thought</span> <span class='k'>as</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span><span class='p'>.</span><span class='n'>Expression</span><span class='p'>):</span>
      <span class='k'>return</span> <span class='p'>[</span><span class='o'>|</span>
        <span class='k'>class</span> <span class='nc'>BigThinker</span><span class='p'>:</span>
          <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
            <span class='k'>return</span> <span class='err'>$</span><span class='n'>thought</span>
      <span class='o'>|</span><span class='p'>]</span>
        
    <span class='k'>for</span> <span class='n'>member</span> <span class='ow'>in</span> <span class='n'>bigThinkerOf</span><span class='p'>([</span><span class='o'>|</span> <span class='mi'>42</span> <span class='o'>|</span><span class='p'>]).</span><span class='n'>Members</span><span class='p'>:</span>
      <span class='nb'>print</span> <span class='n'>member</span><span class='p'>.</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p><em>$</em> is the splicing operator and it instructs the compiler to inject the marked expression into the ast instantiation chain.</p>

<p>Primitive values can also be spliced in:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>primitive</span> <span class='o'>=</span> <span class='mi'>42</span>
    <span class='n'>fragment</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> <span class='err'>$</span><span class='n'>primitive</span> <span class='o'>|</span><span class='p'>]</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span> <span class='c1'># IntegerLiteralExpression</span>
</code></pre></div>
<p>Getting an ast fragment out of a primitive value is called <em>lifting</em> and can be more directly achieved through one of the many <em>Expression.Lift</em>, <em>Statement.Lift</em> and <em>TypeReference.Lift</em> overloads:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>fragment</span> <span class='o'>=</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span><span class='p'>.</span><span class='n'>Expression</span><span class='p'>.</span><span class='n'>Lift</span><span class='p'>(</span><span class='mi'>42</span><span class='p'>)</span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span> <span class='c1'># IntegerLiteralExpression</span>
</code></pre></div>
<p>Complex expressions can be spliced in but must be parenthesized for disambiguation:</p>
<div class='highlight'><pre><code class='boo'>    <span class='n'>primitive</span> <span class='o'>=</span> <span class='mi'>42</span>
    <span class='n'>fragment</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span> <span class='err'>$</span><span class='p'>(</span><span class='n'>primitive</span><span class='p'>.</span><span class='n'>ToString</span><span class='p'>())</span> <span class='o'>|</span><span class='p'>]</span> <span class='c1'># in contrast to [| $primitive.ToString() |] </span>
    <span class='nb'>print</span> <span class='n'>fragment</span><span class='p'>.</span><span class='n'>GetType</span><span class='p'>()</span> <span class='c1'># StringLiteralExpression</span>
</code></pre></div>
<p>And finally an ast fragment can be compiled into runnable code using one of the <em>compile</em> primitives available in the <em>Boo.Lang.Compiler.MetaProgramming</em> namespace:</p>
<div class='highlight'><pre><code class='boo'>    <span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>MetaProgramming</span>
    
    <span class='n'>ast</span> <span class='o'>=</span> <span class='p'>[</span><span class='o'>|</span>
      <span class='k'>class</span> <span class='nc'>BigThinker</span><span class='p'>:</span>
        <span class='k'>def</span> <span class='nf'>ltuae</span><span class='p'>():</span>
          <span class='k'>return</span> <span class='mi'>42</span>
    <span class='o'>|</span><span class='p'>]</span>
    <span class='n'>type</span> <span class='o'>=</span> <span class='n'>compile</span><span class='p'>(</span><span class='n'>ast</span><span class='p'>)</span>
    <span class='n'>instance</span> <span class='k'>as</span> <span class='n'>duck</span> <span class='o'>=</span> <span class='n'>type</span><span class='p'>()</span> <span class='c1'># duck typing to the rescue</span>
    <span class='nb'>print</span> <span class='n'>instance</span><span class='p'>.</span><span class='n'>ltuae</span><span class='p'>()</span>
</code></pre></div>
<p>Runtime code generation is a useful technique but most really interesting metaprogramming opportunities manifest themselves at compile time through one of the extension points provided by boo: attributes, macros, metafunctions and the compilation pipeline which shall all be covered next.</p></content>
  </entry>
  
  <entry>
    <title>Agile Development Ethics</title>
    <link rel='alternate' type='text/html' href='http://bamboo.github.com/2009/11/07/agile-development-ethics.html' />
    <id>tag:bamboo.github.com:/2009/11/07/agile-development-ethics</id>
    <updated>2009-11-07T00:00:00-08:00</updated>
    <summary><h3 id="basic_assumptions">Basic Assumptions</h3>

<p>The purpose of a system is to maximize a user’s capacity for creative expression.</p>

<p>“There is nothing so stable as change.”</p>

<h3 id="values">Values</h3>

<p><em>Learning</em>. The more the team learns the faster the system converges to its purpose. Learning is the smooth embracing of change.</p>

<p><em>Courage</em>. It takes courage to accept ignorance, one’s own and someone else’s. It might take courage to trust one’s best informed judgement at times. Courage keeps the team moving forward.</p>

<h3 id="principles">Principles</h3>

<p>Automate Answers to Important Questions: the most important of which would arguably be “Is the system ready to provide a better experience for its users?” commonly phrased as “Can we ship it?”.</p>

<p>Don’t Repeat Yourself. Repeatition hinders one’s ability to respond to change.</p>

<h3 id="code_of_ethics">Code of Ethics</h3>

<p>Team comprises everyone that care to contribute to the system’s fulfillment of its purpose.</p>

<p>Actions that hurt a user’s ability for creative expression are unethical.</p>

<p>Actions that diminish a team’s ability to respond to change are unethical.</p>

<p>Actions that neither diminish nor improve a team’s ability to respond to change are neutral.</p>

<p>Actions that improve a team’s ability to respond to change are ethical given they don’t hurt a user’s ability for creative expression.</p></summary>
    <content type='html' xml:lang='en' xml:base='http://bamboo.github.com'><h3 id="basic_assumptions">Basic Assumptions</h3>

<p>The purpose of a system is to maximize a user’s capacity for creative expression.</p>

<p>“There is nothing so stable as change.”</p>

<h3 id="values">Values</h3>

<p><em>Learning</em>. The more the team learns the faster the system converges to its purpose. Learning is the smooth embracing of change.</p>

<p><em>Courage</em>. It takes courage to accept ignorance, one’s own and someone else’s. It might take courage to trust one’s best informed judgement at times. Courage keeps the team moving forward.</p>

<h3 id="principles">Principles</h3>

<p>Automate Answers to Important Questions: the most important of which would arguably be “Is the system ready to provide a better experience for its users?” commonly phrased as “Can we ship it?”.</p>

<p>Don’t Repeat Yourself. Repeatition hinders one’s ability to respond to change.</p>

<h3 id="code_of_ethics">Code of Ethics</h3>

<p>Team comprises everyone that care to contribute to the system’s fulfillment of its purpose.</p>

<p>Actions that hurt a user’s ability for creative expression are unethical.</p>

<p>Actions that diminish a team’s ability to respond to change are unethical.</p>

<p>Actions that neither diminish nor improve a team’s ability to respond to change are neutral.</p>

<p>Actions that improve a team’s ability to respond to change are ethical given they don’t hurt a user’s ability for creative expression.</p></content>
  </entry>
  
  <entry>
    <title>Environment Based Programming Design Pattern</title>
    <link rel='alternate' type='text/html' href='http://bamboo.github.com/2009/02/16/environment-based-programming.html' />
    <id>tag:bamboo.github.com:/2009/02/16/environment-based-programming</id>
    <updated>2009-02-16T00:00:00-08:00</updated>
    <summary><p><strong>Motivations</strong>:</p>

<ul>
<li>You want to decouple the different components of a system;</li>

<li>You want to minimize the scope of their dependencies;</li>

<li>You are developing a system that needs to support dynamic reconfigurability;</li>

<li>You want a simple programming model that stirs you in the direction of better dependency management.</li>
</ul>

<p>Environment Based Programming* is a design pattern founded on a very simple principle:</p>

<ul>
<li><strong>Code</strong> executes in an <strong>environment</strong> that <strong>provides</strong> it with all its <strong>needs</strong>.</li>
</ul>

<p>This principle can be completely captured in C# with the following API:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>namespace</span> <span class='nn'>EnvironmentBasedProgramming</span>
        <span class='p'>{</span>
            <span class='k'>public</span> <span class='k'>delegate</span> <span class='k'>void</span> <span class='nf'>Code</span><span class='p'>();</span>
            
            <span class='k'>public</span> <span class='k'>interface</span> <span class='n'>IEnvironment</span>
            <span class='p'>{</span>
                <span class='n'>Need</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;();</span>
            <span class='p'>}</span>
        
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>Environments</span>
            <span class='p'>{</span>   
                <span class='c1'>/// &lt;summary&gt;</span>
                <span class='c1'>/// Executes code in a given environment.</span>
                <span class='c1'>/// &lt;/summary&gt;</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>With</span><span class='p'>(</span><span class='n'>IEnvironment</span> <span class='n'>environment</span><span class='p'>,</span> <span class='n'>Code</span> <span class='n'>code</span><span class='p'>);</span>
            <span class='p'>}</span>
        
            <span class='c1'>/// &lt;summary&gt;</span>
            <span class='c1'>/// Used by code to fulfill its needs.</span>
            <span class='c1'>/// &lt;/summary&gt;</span>
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>My</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='n'>Need</span> <span class='n'>Instance</span> <span class='p'>{</span> <span class='k'>get</span><span class='p'>;</span> <span class='p'>}</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>To make it all concrete I’ll use <a href="http://martinfowler.com/articles/injection.html#ANaiveExample">Martin Fowler’s naive example</a> specially for the contrast with the dependency management approaches he documents in his article. The MovieLister component provides a list of movies directed by a particular director. In order to fulfill its contract it needs the list of all known movies, something that a MovieFinder service would provide:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>interface</span> <span class='n'>IMovieFinder</span>
        <span class='p'>{</span>
            <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>();</span>
        <span class='p'>}</span>
        
        <span class='k'>class</span> <span class='nc'>MovieLister</span>
        <span class='p'>{</span>
            <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='kt'>string</span> <span class='n'>directorName</span><span class='p'>)</span>
            <span class='p'>{</span>
                <span class='kt'>var</span> <span class='n'>movies</span> <span class='p'>=</span> <span class='n'>My</span><span class='p'>&lt;</span><span class='n'>IMovieFinder</span><span class='p'>&gt;.</span><span class='n'>Instance</span><span class='p'>.</span><span class='n'>FindAll</span><span class='p'>();</span>
                <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='n'>movies</span><span class='p'>)</span>
                    <span class='k'>if</span> <span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Director</span> <span class='p'>==</span> <span class='n'>directorName</span><span class='p'>)</span>
                        <span class='k'>yield</span> <span class='k'>return</span> <span class='n'>movie</span><span class='p'>;</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>Notice how the code express its needs using the <strong>My</strong> idiom.</p>

<p>MovieLister can now be executed in a suitable environment using the <strong>With</strong> primitive:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='n'>Environments</span><span class='p'>.</span><span class='n'>With</span><span class='p'>(</span><span class='n'>environment</span><span class='p'>,</span> <span class='k'>delegate</span>
        <span class='p'>{</span>
            <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='k'>new</span> <span class='n'>MovieLister</span><span class='p'>().</span><span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='s'>&quot;Terry Jones&quot;</span><span class='p'>))</span>
                <span class='n'>Console</span><span class='p'>.</span><span class='n'>WriteLine</span><span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Title</span><span class='p'>);</span>
        <span class='p'>});</span>
</code></pre></div>
<p>A suitable environment in this case would have to deliver a valid IMoveFinder instance upon request. The following implementation should suffice:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>class</span> <span class='nc'>DummyMovieFinder</span> <span class='p'>:</span> <span class='n'>IMovieFinder</span>
        <span class='p'>{</span>   
            <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>()</span>
            <span class='p'>{</span>
                <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Jones&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Erik The Viking&quot;</span><span class='p'>};</span>
                <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Gilliam&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Fear and Loathing in Las Vegas&quot;</span><span class='p'>};</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>The missing piece in the puzzle is the final EBP building block - <strong>ClosedEnvironment</strong>:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>public</span> <span class='k'>class</span> <span class='nc'>ClosedEnvironment</span> <span class='p'>:</span> <span class='n'>IEnvironment</span>
        <span class='p'>{</span>
            <span class='k'>private</span> <span class='k'>readonly</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>_bindings</span><span class='p'>;</span>
    
            <span class='k'>public</span> <span class='nf'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>params</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>bindings</span><span class='p'>)</span>
            <span class='p'>{</span>
                <span class='n'>_bindings</span> <span class='p'>=</span> <span class='n'>bindings</span><span class='p'>;</span>
            <span class='p'>}</span>
            
            <span class='k'>public</span> <span class='n'>T</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>T</span><span class='p'>&gt;()</span>
            <span class='p'>{</span>
                <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>binding</span> <span class='k'>in</span> <span class='n'>_bindings</span><span class='p'>)</span>
                    <span class='k'>if</span> <span class='p'>(</span><span class='n'>binding</span> <span class='k'>is</span> <span class='n'>T</span><span class='p'>)</span>
                        <span class='k'>return</span> <span class='p'>(</span><span class='n'>T</span><span class='p'>)</span> <span class='n'>binding</span><span class='p'>;</span>
                <span class='k'>return</span> <span class='nf'>default</span><span class='p'>(</span><span class='n'>T</span><span class='p'>);</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>Which allows the environment for the example to be defined as:</p>
<div class='highlight'><pre><code class='csharp'>    <span class='kt'>var</span> <span class='n'>environment</span> <span class='p'>=</span> <span class='k'>new</span> <span class='n'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>new</span> <span class='n'>DummyMovieFinder</span><span class='p'>());</span>
</code></pre></div>
<p>Component activation and lifetime are not aspects dealt directly with by EBP and are better treated as different environment strategies (one can easily imagine an environment that automatically instantiates components based on naming conventions or metadata).</p>

<p>The complete listings follow.</p>

<p>The example:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>namespace</span> <span class='nn'>EnvironmentBasedProgramming.NaiveExample</span>
        <span class='p'>{</span>
            <span class='k'>using</span> <span class='nn'>System</span><span class='p'>;</span>
            <span class='k'>using</span> <span class='nn'>System.Collections.Generic</span><span class='p'>;</span>
        
            <span class='k'>class</span> <span class='nc'>Movie</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='kt'>string</span> <span class='n'>Title</span> <span class='p'>{</span> <span class='k'>get</span><span class='p'>;</span> <span class='k'>set</span><span class='p'>;</span> <span class='p'>}</span>
                <span class='k'>public</span> <span class='kt'>string</span> <span class='n'>Director</span> <span class='p'>{</span> <span class='k'>get</span><span class='p'>;</span> <span class='k'>set</span><span class='p'>;</span> <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='k'>interface</span> <span class='n'>IMovieFinder</span>
            <span class='p'>{</span>
                <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>();</span>
            <span class='p'>}</span>
        
            <span class='k'>class</span> <span class='nc'>MovieLister</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='kt'>string</span> <span class='n'>directorName</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='kt'>var</span> <span class='n'>movies</span> <span class='p'>=</span> <span class='n'>My</span><span class='p'>&lt;</span><span class='n'>IMovieFinder</span><span class='p'>&gt;.</span><span class='n'>Instance</span><span class='p'>.</span><span class='n'>FindAll</span><span class='p'>();</span>
                    <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='n'>movies</span><span class='p'>)</span>
                        <span class='k'>if</span> <span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Director</span> <span class='p'>==</span> <span class='n'>directorName</span><span class='p'>)</span>
                            <span class='k'>yield</span> <span class='k'>return</span> <span class='n'>movie</span><span class='p'>;</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='k'>class</span> <span class='nc'>Program</span>
            <span class='p'>{</span>
                <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>Main</span><span class='p'>(</span><span class='kt'>string</span><span class='p'>[]</span> <span class='n'>args</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='kt'>var</span> <span class='n'>environment</span> <span class='p'>=</span> <span class='k'>new</span> <span class='n'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>new</span> <span class='n'>DummyMovieFinder</span><span class='p'>());</span>
                    <span class='n'>Environments</span><span class='p'>.</span><span class='n'>With</span><span class='p'>(</span><span class='n'>environment</span><span class='p'>,</span> <span class='k'>delegate</span>
                    <span class='p'>{</span>
                        <span class='n'>PrintMoviesDirectedBy</span><span class='p'>(</span><span class='s'>&quot;Terry Jones&quot;</span><span class='p'>);</span>
                    <span class='p'>});</span>
                <span class='p'>}</span>
        
                <span class='k'>private</span> <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>PrintMoviesDirectedBy</span><span class='p'>(</span><span class='kt'>string</span> <span class='n'>directorName</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='k'>new</span> <span class='n'>MovieLister</span><span class='p'>().</span><span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='n'>directorName</span><span class='p'>))</span>
                        <span class='n'>Console</span><span class='p'>.</span><span class='n'>WriteLine</span><span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Title</span><span class='p'>);</span>
                <span class='p'>}</span>
        
                <span class='k'>class</span> <span class='nc'>DummyMovieFinder</span> <span class='p'>:</span> <span class='n'>IMovieFinder</span>
                <span class='p'>{</span>   
                    <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>()</span>
                    <span class='p'>{</span>
                        <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Jones&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Erik The Viking&quot;</span><span class='p'>};</span>
                        <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Gilliam&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Fear and Loathing in Las Vegas&quot;</span><span class='p'>};</span>
                    <span class='p'>}</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>The minimalist EBP framework written for this article:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>namespace</span> <span class='nn'>EnvironmentBasedProgramming</span>
        <span class='p'>{</span>
            <span class='k'>using</span> <span class='nn'>System</span><span class='p'>;</span>
        
            <span class='k'>public</span> <span class='k'>delegate</span> <span class='k'>void</span> <span class='nf'>Code</span><span class='p'>();</span>
        
            <span class='k'>public</span> <span class='k'>interface</span> <span class='n'>IEnvironment</span>
            <span class='p'>{</span>
                <span class='n'>Need</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;();</span>
            <span class='p'>}</span>
        
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>Environments</span>
            <span class='p'>{</span>   
                <span class='c1'>/// &lt;summary&gt;</span>
                <span class='c1'>/// Executes code in a given environment.</span>
                <span class='c1'>/// &lt;/summary&gt;</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>With</span><span class='p'>(</span><span class='n'>IEnvironment</span> <span class='n'>environment</span><span class='p'>,</span> <span class='n'>Code</span> <span class='n'>code</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='n'>IEnvironment</span> <span class='n'>previous</span> <span class='p'>=</span> <span class='n'>_environment</span><span class='p'>;</span>
                    <span class='n'>_environment</span> <span class='p'>=</span> <span class='n'>environment</span><span class='p'>;</span>
                    <span class='k'>try</span>
                    <span class='p'>{</span>
                        <span class='n'>code</span><span class='p'>();</span>
                    <span class='p'>}</span>
                    <span class='k'>finally</span>
                    <span class='p'>{</span>
                        <span class='n'>_environment</span> <span class='p'>=</span> <span class='n'>previous</span><span class='p'>;</span>
                    <span class='p'>}</span>
                <span class='p'>}</span>
        
                <span class='k'>private</span> <span class='k'>static</span> <span class='n'>IEnvironment</span> <span class='n'>_environment</span><span class='p'>;</span>
        
                <span class='k'>internal</span> <span class='k'>static</span> <span class='n'>IEnvironment</span> <span class='n'>Current</span>
                <span class='p'>{</span>
                    <span class='k'>get</span> <span class='p'>{</span> <span class='k'>return</span> <span class='n'>_environment</span><span class='p'>;</span> <span class='p'>}</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='c1'>/// &lt;summary&gt;</span>
            <span class='c1'>/// Used by code to fulfill its needs.</span>
            <span class='c1'>/// &lt;/summary&gt;</span>
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>My</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='n'>Need</span> <span class='n'>Instance</span>
                <span class='p'>{</span>
                    <span class='k'>get</span>
                    <span class='p'>{</span>
                        <span class='kt'>var</span> <span class='n'>current</span> <span class='p'>=</span> <span class='n'>Environments</span><span class='p'>.</span><span class='n'>Current</span><span class='p'>;</span>
                        <span class='k'>if</span> <span class='p'>(</span><span class='n'>current</span> <span class='p'>==</span> <span class='k'>null</span><span class='p'>)</span>
                            <span class='k'>throw</span> <span class='k'>new</span> <span class='nf'>InvalidOperationException</span><span class='p'>(</span><span class='s'>&quot;No environment to provide &#39;&quot;</span> <span class='p'>+</span> <span class='k'>typeof</span><span class='p'>(</span><span class='n'>Need</span><span class='p'>)</span> <span class='p'>+</span> <span class='s'>&quot;&#39;.&quot;</span><span class='p'>);</span>
                        <span class='k'>return</span> <span class='n'>current</span><span class='p'>.</span><span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;();</span>
                    <span class='p'>}</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='k'>public</span> <span class='k'>class</span> <span class='nc'>ClosedEnvironment</span> <span class='p'>:</span> <span class='n'>IEnvironment</span>
            <span class='p'>{</span>
                <span class='k'>private</span> <span class='k'>readonly</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>_bindings</span><span class='p'>;</span>
        
                <span class='k'>public</span> <span class='nf'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>params</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>bindings</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='n'>_bindings</span> <span class='p'>=</span> <span class='n'>bindings</span><span class='p'>;</span>
                <span class='p'>}</span>
                
                <span class='k'>public</span> <span class='n'>T</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>T</span><span class='p'>&gt;()</span>
                <span class='p'>{</span>
                    <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>binding</span> <span class='k'>in</span> <span class='n'>_bindings</span><span class='p'>)</span>
                        <span class='k'>if</span> <span class='p'>(</span><span class='n'>binding</span> <span class='k'>is</span> <span class='n'>T</span><span class='p'>)</span>
                            <span class='k'>return</span> <span class='p'>(</span><span class='n'>T</span><span class='p'>)</span> <span class='n'>binding</span><span class='p'>;</span>
                    <span class='k'>return</span> <span class='nf'>default</span><span class='p'>(</span><span class='n'>T</span><span class='p'>);</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>In a future article I’ll explore environment chaining and convention based service discovery. Thoughts?</p>

<ul>
<li>or to use a name more to the style of Martin Fowler: Dynamically Scoped Service Locator (<strong>not</strong> to be confused with <a href="http://martinfowler.com/articles/injection.html#ADynamicServiceLocator">Dynamic Service Locator</a>)</li>
</ul></summary>
    <content type='html' xml:lang='en' xml:base='http://bamboo.github.com'><p><strong>Motivations</strong>:</p>

<ul>
<li>You want to decouple the different components of a system;</li>

<li>You want to minimize the scope of their dependencies;</li>

<li>You are developing a system that needs to support dynamic reconfigurability;</li>

<li>You want a simple programming model that stirs you in the direction of better dependency management.</li>
</ul>

<p>Environment Based Programming* is a design pattern founded on a very simple principle:</p>

<ul>
<li><strong>Code</strong> executes in an <strong>environment</strong> that <strong>provides</strong> it with all its <strong>needs</strong>.</li>
</ul>

<p>This principle can be completely captured in C# with the following API:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>namespace</span> <span class='nn'>EnvironmentBasedProgramming</span>
        <span class='p'>{</span>
            <span class='k'>public</span> <span class='k'>delegate</span> <span class='k'>void</span> <span class='nf'>Code</span><span class='p'>();</span>
            
            <span class='k'>public</span> <span class='k'>interface</span> <span class='n'>IEnvironment</span>
            <span class='p'>{</span>
                <span class='n'>Need</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;();</span>
            <span class='p'>}</span>
        
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>Environments</span>
            <span class='p'>{</span>   
                <span class='c1'>/// &lt;summary&gt;</span>
                <span class='c1'>/// Executes code in a given environment.</span>
                <span class='c1'>/// &lt;/summary&gt;</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>With</span><span class='p'>(</span><span class='n'>IEnvironment</span> <span class='n'>environment</span><span class='p'>,</span> <span class='n'>Code</span> <span class='n'>code</span><span class='p'>);</span>
            <span class='p'>}</span>
        
            <span class='c1'>/// &lt;summary&gt;</span>
            <span class='c1'>/// Used by code to fulfill its needs.</span>
            <span class='c1'>/// &lt;/summary&gt;</span>
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>My</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='n'>Need</span> <span class='n'>Instance</span> <span class='p'>{</span> <span class='k'>get</span><span class='p'>;</span> <span class='p'>}</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>To make it all concrete I’ll use <a href="http://martinfowler.com/articles/injection.html#ANaiveExample">Martin Fowler’s naive example</a> specially for the contrast with the dependency management approaches he documents in his article. The MovieLister component provides a list of movies directed by a particular director. In order to fulfill its contract it needs the list of all known movies, something that a MovieFinder service would provide:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>interface</span> <span class='n'>IMovieFinder</span>
        <span class='p'>{</span>
            <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>();</span>
        <span class='p'>}</span>
        
        <span class='k'>class</span> <span class='nc'>MovieLister</span>
        <span class='p'>{</span>
            <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='kt'>string</span> <span class='n'>directorName</span><span class='p'>)</span>
            <span class='p'>{</span>
                <span class='kt'>var</span> <span class='n'>movies</span> <span class='p'>=</span> <span class='n'>My</span><span class='p'>&lt;</span><span class='n'>IMovieFinder</span><span class='p'>&gt;.</span><span class='n'>Instance</span><span class='p'>.</span><span class='n'>FindAll</span><span class='p'>();</span>
                <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='n'>movies</span><span class='p'>)</span>
                    <span class='k'>if</span> <span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Director</span> <span class='p'>==</span> <span class='n'>directorName</span><span class='p'>)</span>
                        <span class='k'>yield</span> <span class='k'>return</span> <span class='n'>movie</span><span class='p'>;</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>Notice how the code express its needs using the <strong>My</strong> idiom.</p>

<p>MovieLister can now be executed in a suitable environment using the <strong>With</strong> primitive:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='n'>Environments</span><span class='p'>.</span><span class='n'>With</span><span class='p'>(</span><span class='n'>environment</span><span class='p'>,</span> <span class='k'>delegate</span>
        <span class='p'>{</span>
            <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='k'>new</span> <span class='n'>MovieLister</span><span class='p'>().</span><span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='s'>&quot;Terry Jones&quot;</span><span class='p'>))</span>
                <span class='n'>Console</span><span class='p'>.</span><span class='n'>WriteLine</span><span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Title</span><span class='p'>);</span>
        <span class='p'>});</span>
</code></pre></div>
<p>A suitable environment in this case would have to deliver a valid IMoveFinder instance upon request. The following implementation should suffice:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>class</span> <span class='nc'>DummyMovieFinder</span> <span class='p'>:</span> <span class='n'>IMovieFinder</span>
        <span class='p'>{</span>   
            <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>()</span>
            <span class='p'>{</span>
                <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Jones&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Erik The Viking&quot;</span><span class='p'>};</span>
                <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Gilliam&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Fear and Loathing in Las Vegas&quot;</span><span class='p'>};</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>The missing piece in the puzzle is the final EBP building block - <strong>ClosedEnvironment</strong>:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>public</span> <span class='k'>class</span> <span class='nc'>ClosedEnvironment</span> <span class='p'>:</span> <span class='n'>IEnvironment</span>
        <span class='p'>{</span>
            <span class='k'>private</span> <span class='k'>readonly</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>_bindings</span><span class='p'>;</span>
    
            <span class='k'>public</span> <span class='nf'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>params</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>bindings</span><span class='p'>)</span>
            <span class='p'>{</span>
                <span class='n'>_bindings</span> <span class='p'>=</span> <span class='n'>bindings</span><span class='p'>;</span>
            <span class='p'>}</span>
            
            <span class='k'>public</span> <span class='n'>T</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>T</span><span class='p'>&gt;()</span>
            <span class='p'>{</span>
                <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>binding</span> <span class='k'>in</span> <span class='n'>_bindings</span><span class='p'>)</span>
                    <span class='k'>if</span> <span class='p'>(</span><span class='n'>binding</span> <span class='k'>is</span> <span class='n'>T</span><span class='p'>)</span>
                        <span class='k'>return</span> <span class='p'>(</span><span class='n'>T</span><span class='p'>)</span> <span class='n'>binding</span><span class='p'>;</span>
                <span class='k'>return</span> <span class='nf'>default</span><span class='p'>(</span><span class='n'>T</span><span class='p'>);</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>Which allows the environment for the example to be defined as:</p>
<div class='highlight'><pre><code class='csharp'>    <span class='kt'>var</span> <span class='n'>environment</span> <span class='p'>=</span> <span class='k'>new</span> <span class='n'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>new</span> <span class='n'>DummyMovieFinder</span><span class='p'>());</span>
</code></pre></div>
<p>Component activation and lifetime are not aspects dealt directly with by EBP and are better treated as different environment strategies (one can easily imagine an environment that automatically instantiates components based on naming conventions or metadata).</p>

<p>The complete listings follow.</p>

<p>The example:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>namespace</span> <span class='nn'>EnvironmentBasedProgramming.NaiveExample</span>
        <span class='p'>{</span>
            <span class='k'>using</span> <span class='nn'>System</span><span class='p'>;</span>
            <span class='k'>using</span> <span class='nn'>System.Collections.Generic</span><span class='p'>;</span>
        
            <span class='k'>class</span> <span class='nc'>Movie</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='kt'>string</span> <span class='n'>Title</span> <span class='p'>{</span> <span class='k'>get</span><span class='p'>;</span> <span class='k'>set</span><span class='p'>;</span> <span class='p'>}</span>
                <span class='k'>public</span> <span class='kt'>string</span> <span class='n'>Director</span> <span class='p'>{</span> <span class='k'>get</span><span class='p'>;</span> <span class='k'>set</span><span class='p'>;</span> <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='k'>interface</span> <span class='n'>IMovieFinder</span>
            <span class='p'>{</span>
                <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>();</span>
            <span class='p'>}</span>
        
            <span class='k'>class</span> <span class='nc'>MovieLister</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='kt'>string</span> <span class='n'>directorName</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='kt'>var</span> <span class='n'>movies</span> <span class='p'>=</span> <span class='n'>My</span><span class='p'>&lt;</span><span class='n'>IMovieFinder</span><span class='p'>&gt;.</span><span class='n'>Instance</span><span class='p'>.</span><span class='n'>FindAll</span><span class='p'>();</span>
                    <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='n'>movies</span><span class='p'>)</span>
                        <span class='k'>if</span> <span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Director</span> <span class='p'>==</span> <span class='n'>directorName</span><span class='p'>)</span>
                            <span class='k'>yield</span> <span class='k'>return</span> <span class='n'>movie</span><span class='p'>;</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='k'>class</span> <span class='nc'>Program</span>
            <span class='p'>{</span>
                <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>Main</span><span class='p'>(</span><span class='kt'>string</span><span class='p'>[]</span> <span class='n'>args</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='kt'>var</span> <span class='n'>environment</span> <span class='p'>=</span> <span class='k'>new</span> <span class='n'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>new</span> <span class='n'>DummyMovieFinder</span><span class='p'>());</span>
                    <span class='n'>Environments</span><span class='p'>.</span><span class='n'>With</span><span class='p'>(</span><span class='n'>environment</span><span class='p'>,</span> <span class='k'>delegate</span>
                    <span class='p'>{</span>
                        <span class='n'>PrintMoviesDirectedBy</span><span class='p'>(</span><span class='s'>&quot;Terry Jones&quot;</span><span class='p'>);</span>
                    <span class='p'>});</span>
                <span class='p'>}</span>
        
                <span class='k'>private</span> <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>PrintMoviesDirectedBy</span><span class='p'>(</span><span class='kt'>string</span> <span class='n'>directorName</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>movie</span> <span class='k'>in</span> <span class='k'>new</span> <span class='n'>MovieLister</span><span class='p'>().</span><span class='n'>MoviesDirectedBy</span><span class='p'>(</span><span class='n'>directorName</span><span class='p'>))</span>
                        <span class='n'>Console</span><span class='p'>.</span><span class='n'>WriteLine</span><span class='p'>(</span><span class='n'>movie</span><span class='p'>.</span><span class='n'>Title</span><span class='p'>);</span>
                <span class='p'>}</span>
        
                <span class='k'>class</span> <span class='nc'>DummyMovieFinder</span> <span class='p'>:</span> <span class='n'>IMovieFinder</span>
                <span class='p'>{</span>   
                    <span class='k'>public</span> <span class='n'>IEnumerable</span><span class='p'>&lt;</span><span class='n'>Movie</span><span class='p'>&gt;</span> <span class='n'>FindAll</span><span class='p'>()</span>
                    <span class='p'>{</span>
                        <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Jones&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Erik The Viking&quot;</span><span class='p'>};</span>
                        <span class='k'>yield</span> <span class='k'>return</span> <span class='k'>new</span> <span class='n'>Movie</span> <span class='p'>{</span><span class='n'>Director</span> <span class='p'>=</span> <span class='s'>&quot;Terry Gilliam&quot;</span><span class='p'>,</span> <span class='n'>Title</span> <span class='p'>=</span> <span class='s'>&quot;Fear and Loathing in Las Vegas&quot;</span><span class='p'>};</span>
                    <span class='p'>}</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>The minimalist EBP framework written for this article:</p>
<div class='highlight'><pre><code class='csharp'>        <span class='k'>namespace</span> <span class='nn'>EnvironmentBasedProgramming</span>
        <span class='p'>{</span>
            <span class='k'>using</span> <span class='nn'>System</span><span class='p'>;</span>
        
            <span class='k'>public</span> <span class='k'>delegate</span> <span class='k'>void</span> <span class='nf'>Code</span><span class='p'>();</span>
        
            <span class='k'>public</span> <span class='k'>interface</span> <span class='n'>IEnvironment</span>
            <span class='p'>{</span>
                <span class='n'>Need</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;();</span>
            <span class='p'>}</span>
        
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>Environments</span>
            <span class='p'>{</span>   
                <span class='c1'>/// &lt;summary&gt;</span>
                <span class='c1'>/// Executes code in a given environment.</span>
                <span class='c1'>/// &lt;/summary&gt;</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='k'>void</span> <span class='nf'>With</span><span class='p'>(</span><span class='n'>IEnvironment</span> <span class='n'>environment</span><span class='p'>,</span> <span class='n'>Code</span> <span class='n'>code</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='n'>IEnvironment</span> <span class='n'>previous</span> <span class='p'>=</span> <span class='n'>_environment</span><span class='p'>;</span>
                    <span class='n'>_environment</span> <span class='p'>=</span> <span class='n'>environment</span><span class='p'>;</span>
                    <span class='k'>try</span>
                    <span class='p'>{</span>
                        <span class='n'>code</span><span class='p'>();</span>
                    <span class='p'>}</span>
                    <span class='k'>finally</span>
                    <span class='p'>{</span>
                        <span class='n'>_environment</span> <span class='p'>=</span> <span class='n'>previous</span><span class='p'>;</span>
                    <span class='p'>}</span>
                <span class='p'>}</span>
        
                <span class='k'>private</span> <span class='k'>static</span> <span class='n'>IEnvironment</span> <span class='n'>_environment</span><span class='p'>;</span>
        
                <span class='k'>internal</span> <span class='k'>static</span> <span class='n'>IEnvironment</span> <span class='n'>Current</span>
                <span class='p'>{</span>
                    <span class='k'>get</span> <span class='p'>{</span> <span class='k'>return</span> <span class='n'>_environment</span><span class='p'>;</span> <span class='p'>}</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='c1'>/// &lt;summary&gt;</span>
            <span class='c1'>/// Used by code to fulfill its needs.</span>
            <span class='c1'>/// &lt;/summary&gt;</span>
            <span class='k'>public</span> <span class='k'>static</span> <span class='k'>class</span> <span class='nc'>My</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;</span>
            <span class='p'>{</span>
                <span class='k'>public</span> <span class='k'>static</span> <span class='n'>Need</span> <span class='n'>Instance</span>
                <span class='p'>{</span>
                    <span class='k'>get</span>
                    <span class='p'>{</span>
                        <span class='kt'>var</span> <span class='n'>current</span> <span class='p'>=</span> <span class='n'>Environments</span><span class='p'>.</span><span class='n'>Current</span><span class='p'>;</span>
                        <span class='k'>if</span> <span class='p'>(</span><span class='n'>current</span> <span class='p'>==</span> <span class='k'>null</span><span class='p'>)</span>
                            <span class='k'>throw</span> <span class='k'>new</span> <span class='nf'>InvalidOperationException</span><span class='p'>(</span><span class='s'>&quot;No environment to provide &#39;&quot;</span> <span class='p'>+</span> <span class='k'>typeof</span><span class='p'>(</span><span class='n'>Need</span><span class='p'>)</span> <span class='p'>+</span> <span class='s'>&quot;&#39;.&quot;</span><span class='p'>);</span>
                        <span class='k'>return</span> <span class='n'>current</span><span class='p'>.</span><span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>Need</span><span class='p'>&gt;();</span>
                    <span class='p'>}</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        
            <span class='k'>public</span> <span class='k'>class</span> <span class='nc'>ClosedEnvironment</span> <span class='p'>:</span> <span class='n'>IEnvironment</span>
            <span class='p'>{</span>
                <span class='k'>private</span> <span class='k'>readonly</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>_bindings</span><span class='p'>;</span>
        
                <span class='k'>public</span> <span class='nf'>ClosedEnvironment</span><span class='p'>(</span><span class='k'>params</span> <span class='kt'>object</span><span class='p'>[]</span> <span class='n'>bindings</span><span class='p'>)</span>
                <span class='p'>{</span>
                    <span class='n'>_bindings</span> <span class='p'>=</span> <span class='n'>bindings</span><span class='p'>;</span>
                <span class='p'>}</span>
                
                <span class='k'>public</span> <span class='n'>T</span> <span class='n'>Provide</span><span class='p'>&lt;</span><span class='n'>T</span><span class='p'>&gt;()</span>
                <span class='p'>{</span>
                    <span class='k'>foreach</span> <span class='p'>(</span><span class='kt'>var</span> <span class='n'>binding</span> <span class='k'>in</span> <span class='n'>_bindings</span><span class='p'>)</span>
                        <span class='k'>if</span> <span class='p'>(</span><span class='n'>binding</span> <span class='k'>is</span> <span class='n'>T</span><span class='p'>)</span>
                            <span class='k'>return</span> <span class='p'>(</span><span class='n'>T</span><span class='p'>)</span> <span class='n'>binding</span><span class='p'>;</span>
                    <span class='k'>return</span> <span class='nf'>default</span><span class='p'>(</span><span class='n'>T</span><span class='p'>);</span>
                <span class='p'>}</span>
            <span class='p'>}</span>
        <span class='p'>}</span>
</code></pre></div>
<p>In a future article I’ll explore environment chaining and convention based service discovery. Thoughts?</p>

<ul>
<li>or to use a name more to the style of Martin Fowler: Dynamically Scoped Service Locator (<strong>not</strong> to be confused with <a href="http://martinfowler.com/articles/injection.html#ADynamicServiceLocator">Dynamic Service Locator</a>)</li>
</ul></content>
  </entry>
  
  <entry>
    <title>boo, ometa and extensible parsing I</title>
    <link rel='alternate' type='text/html' href='http://bamboo.github.com/2008/08/05/boo-ometa-and-extensible-parsing-I.html' />
    <id>tag:bamboo.github.com:/2008/08/05/boo-ometa-and-extensible-parsing-I</id>
    <updated>2008-08-05T00:00:00-07:00</updated>
    <summary><p>Meanwhile in a repository not far away:</p>
<div class='highlight'><pre><code class='boo'><span class='k'>namespace</span> <span class='nn'>metaboo</span>

<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span>
<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span>
<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>OMeta</span>
<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>OMeta</span><span class='p'>.</span><span class='n'>Parser</span>

<span class='n'>syntax</span> <span class='n'>Units</span><span class='p'>:</span>
	<span class='n'>atom</span> <span class='o'>=</span> <span class='n'>mass</span> <span class='o'>|</span> <span class='k'>super</span>
	<span class='n'>mass</span> <span class='o'>=</span> <span class='p'>(</span><span class='n'>integer</span> <span class='o'>&gt;&gt;</span> <span class='n'>value</span> <span class='k'>as</span> <span class='n'>Expression</span><span class='p'>,</span> <span class='s2'>&quot;kg&quot;</span><span class='p'>)</span> <span class='o'>^</span> <span class='p'>[</span><span class='o'>|</span> <span class='n'>Mass</span><span class='p'>(</span><span class='err'>$</span><span class='n'>value</span><span class='p'>,</span> <span class='s2'>&quot;kg&quot;</span><span class='p'>)</span> <span class='o'>|</span><span class='p'>]</span>

<span class='n'>syntax</span> <span class='n'>Ranges</span><span class='p'>:</span>
	<span class='n'>atom</span> <span class='o'>=</span> <span class='n'>integer_range</span> <span class='o'>|</span> <span class='k'>super</span>
	<span class='n'>integer_range</span> <span class='o'>=</span> <span class='p'>(</span><span class='n'>integer</span> <span class='o'>&gt;&gt;</span> <span class='n'>begin</span> <span class='k'>as</span> <span class='n'>Expression</span><span class='p'>,</span> <span class='n'>DOT</span><span class='p'>,</span> <span class='n'>DOT</span><span class='p'>,</span> <span class='n'>integer</span> <span class='o'>&gt;&gt;</span> <span class='n'>end</span> <span class='k'>as</span> <span class='n'>Expression</span><span class='p'>)</span> <span class='o'>^</span> <span class='p'>[</span><span class='o'>|</span> <span class='nb'>range</span><span class='p'>(</span><span class='err'>$</span><span class='n'>begin</span><span class='p'>,</span> <span class='err'>$</span><span class='n'>end</span><span class='p'>)</span> <span class='o'>|</span><span class='p'>]</span>

<span class='k'>def</span> <span class='nf'>parse</span><span class='p'>(</span><span class='n'>code</span> <span class='k'>as</span> <span class='n'>string</span><span class='p'>):</span>
	<span class='n'>compiler</span> <span class='o'>=</span> <span class='n'>BooCompiler</span><span class='p'>()</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>References</span><span class='p'>.</span><span class='n'>Add</span><span class='p'>(</span><span class='n'>System</span><span class='p'>.</span><span class='n'>Reflection</span><span class='p'>.</span><span class='n'>Assembly</span><span class='p'>.</span><span class='n'>GetExecutingAssembly</span><span class='p'>())</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>Input</span><span class='p'>.</span><span class='n'>Add</span><span class='p'>(</span><span class='n'>IO</span><span class='p'>.</span><span class='n'>StringInput</span><span class='p'>(</span><span class='s2'>&quot;code&quot;</span><span class='p'>,</span> <span class='n'>code</span><span class='p'>))</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>Pipeline</span> <span class='o'>=</span> <span class='n'>CompilerPipeline</span><span class='p'>()</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>Pipeline</span><span class='p'>.</span><span class='n'>Add</span><span class='p'>(</span><span class='n'>BooParserStep</span><span class='p'>())</span>
	<span class='k'>return</span> <span class='n'>compiler</span><span class='p'>.</span><span class='n'>Run</span><span class='p'>()</span>

<span class='n'>code</span> <span class='o'>=</span> <span class='s2'>&quot;&quot;&quot;</span>
<span class='s2'>import metaboo.Units</span>
<span class='s2'>import metaboo.Ranges</span>
<span class='s2'>a = 3kg</span>
<span class='s2'>print a</span>
<span class='s2'>for i in 1..3:</span>
<span class='s2'>	print i</span>
<span class='s2'>&quot;&quot;&quot;</span>

<span class='n'>result</span> <span class='o'>=</span> <span class='n'>parse</span><span class='p'>(</span><span class='n'>code</span><span class='p'>)</span>
<span class='nb'>assert</span> <span class='mi'>0</span> <span class='o'>==</span> <span class='nb'>len</span><span class='p'>(</span><span class='n'>result</span><span class='p'>.</span><span class='n'>Errors</span><span class='p'>),</span> <span class='n'>result</span><span class='p'>.</span><span class='n'>Errors</span><span class='p'>.</span><span class='n'>ToString</span><span class='p'>()</span>
<span class='nb'>assert</span> <span class='mi'>1</span> <span class='o'>==</span> <span class='nb'>len</span><span class='p'>(</span><span class='n'>result</span><span class='p'>.</span><span class='n'>CompileUnit</span><span class='p'>.</span><span class='n'>Modules</span><span class='p'>)</span>
<span class='nb'>print</span> <span class='n'>result</span><span class='p'>.</span><span class='n'>CompileUnit</span><span class='p'>.</span><span class='n'>Modules</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>].</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p>And the output is, of course:</p>

<pre><code>import metaboo.Units
import metaboo.Ranges

a = Mass(3, &#39;kg&#39;)
print a
for i in range(1, 3):
    print i</code></pre></summary>
    <content type='html' xml:lang='en' xml:base='http://bamboo.github.com'><p>Meanwhile in a repository not far away:</p>
<div class='highlight'><pre><code class='boo'><span class='k'>namespace</span> <span class='nn'>metaboo</span>

<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span>
<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>Lang</span><span class='p'>.</span><span class='n'>Compiler</span><span class='p'>.</span><span class='n'>Ast</span>
<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>OMeta</span>
<span class='k'>import</span> <span class='n'>Boo</span><span class='p'>.</span><span class='n'>OMeta</span><span class='p'>.</span><span class='n'>Parser</span>

<span class='n'>syntax</span> <span class='n'>Units</span><span class='p'>:</span>
	<span class='n'>atom</span> <span class='o'>=</span> <span class='n'>mass</span> <span class='o'>|</span> <span class='k'>super</span>
	<span class='n'>mass</span> <span class='o'>=</span> <span class='p'>(</span><span class='n'>integer</span> <span class='o'>&gt;&gt;</span> <span class='n'>value</span> <span class='k'>as</span> <span class='n'>Expression</span><span class='p'>,</span> <span class='s2'>&quot;kg&quot;</span><span class='p'>)</span> <span class='o'>^</span> <span class='p'>[</span><span class='o'>|</span> <span class='n'>Mass</span><span class='p'>(</span><span class='err'>$</span><span class='n'>value</span><span class='p'>,</span> <span class='s2'>&quot;kg&quot;</span><span class='p'>)</span> <span class='o'>|</span><span class='p'>]</span>

<span class='n'>syntax</span> <span class='n'>Ranges</span><span class='p'>:</span>
	<span class='n'>atom</span> <span class='o'>=</span> <span class='n'>integer_range</span> <span class='o'>|</span> <span class='k'>super</span>
	<span class='n'>integer_range</span> <span class='o'>=</span> <span class='p'>(</span><span class='n'>integer</span> <span class='o'>&gt;&gt;</span> <span class='n'>begin</span> <span class='k'>as</span> <span class='n'>Expression</span><span class='p'>,</span> <span class='n'>DOT</span><span class='p'>,</span> <span class='n'>DOT</span><span class='p'>,</span> <span class='n'>integer</span> <span class='o'>&gt;&gt;</span> <span class='n'>end</span> <span class='k'>as</span> <span class='n'>Expression</span><span class='p'>)</span> <span class='o'>^</span> <span class='p'>[</span><span class='o'>|</span> <span class='nb'>range</span><span class='p'>(</span><span class='err'>$</span><span class='n'>begin</span><span class='p'>,</span> <span class='err'>$</span><span class='n'>end</span><span class='p'>)</span> <span class='o'>|</span><span class='p'>]</span>

<span class='k'>def</span> <span class='nf'>parse</span><span class='p'>(</span><span class='n'>code</span> <span class='k'>as</span> <span class='n'>string</span><span class='p'>):</span>
	<span class='n'>compiler</span> <span class='o'>=</span> <span class='n'>BooCompiler</span><span class='p'>()</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>References</span><span class='p'>.</span><span class='n'>Add</span><span class='p'>(</span><span class='n'>System</span><span class='p'>.</span><span class='n'>Reflection</span><span class='p'>.</span><span class='n'>Assembly</span><span class='p'>.</span><span class='n'>GetExecutingAssembly</span><span class='p'>())</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>Input</span><span class='p'>.</span><span class='n'>Add</span><span class='p'>(</span><span class='n'>IO</span><span class='p'>.</span><span class='n'>StringInput</span><span class='p'>(</span><span class='s2'>&quot;code&quot;</span><span class='p'>,</span> <span class='n'>code</span><span class='p'>))</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>Pipeline</span> <span class='o'>=</span> <span class='n'>CompilerPipeline</span><span class='p'>()</span>
	<span class='n'>compiler</span><span class='p'>.</span><span class='n'>Parameters</span><span class='p'>.</span><span class='n'>Pipeline</span><span class='p'>.</span><span class='n'>Add</span><span class='p'>(</span><span class='n'>BooParserStep</span><span class='p'>())</span>
	<span class='k'>return</span> <span class='n'>compiler</span><span class='p'>.</span><span class='n'>Run</span><span class='p'>()</span>

<span class='n'>code</span> <span class='o'>=</span> <span class='s2'>&quot;&quot;&quot;</span>
<span class='s2'>import metaboo.Units</span>
<span class='s2'>import metaboo.Ranges</span>
<span class='s2'>a = 3kg</span>
<span class='s2'>print a</span>
<span class='s2'>for i in 1..3:</span>
<span class='s2'>	print i</span>
<span class='s2'>&quot;&quot;&quot;</span>

<span class='n'>result</span> <span class='o'>=</span> <span class='n'>parse</span><span class='p'>(</span><span class='n'>code</span><span class='p'>)</span>
<span class='nb'>assert</span> <span class='mi'>0</span> <span class='o'>==</span> <span class='nb'>len</span><span class='p'>(</span><span class='n'>result</span><span class='p'>.</span><span class='n'>Errors</span><span class='p'>),</span> <span class='n'>result</span><span class='p'>.</span><span class='n'>Errors</span><span class='p'>.</span><span class='n'>ToString</span><span class='p'>()</span>
<span class='nb'>assert</span> <span class='mi'>1</span> <span class='o'>==</span> <span class='nb'>len</span><span class='p'>(</span><span class='n'>result</span><span class='p'>.</span><span class='n'>CompileUnit</span><span class='p'>.</span><span class='n'>Modules</span><span class='p'>)</span>
<span class='nb'>print</span> <span class='n'>result</span><span class='p'>.</span><span class='n'>CompileUnit</span><span class='p'>.</span><span class='n'>Modules</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>].</span><span class='n'>ToCodeString</span><span class='p'>()</span>
</code></pre></div>
<p>And the output is, of course:</p>

<pre><code>import metaboo.Units
import metaboo.Ranges

a = Mass(3, &#39;kg&#39;)
print a
for i in range(1, 3):
    print i</code></pre></content>
  </entry>
  
  <entry>
    <title>Back from Mono Summit 2007</title>
    <link rel='alternate' type='text/html' href='http://bamboo.github.com/2007/12/04/back-from-mono-summit-07.html' />
    <id>tag:bamboo.github.com:/2007/12/04/back-from-mono-summit-07</id>
    <updated>2007-12-04T00:00:00-08:00</updated>
    <summary><p><img src="http://www.mono-project.com/files/4/42/Summit.png" alt="Mono Summit 2007" title="Mono Summit 2007" /></p>

<p>What a great experience.</p>

<p>A chance to interact live with a <a href="http://evain.net/blog/">dear friend</a>. Free Software, Hacking, Women, Futurama, McDonalds, love spreading, Militant Atheism, Monty Python, Douglas Adams and the French Way.</p>

<p>Had lots of interesting exchange of ideas with <a href="http://primates.ximian.com/~massi/all.html">Massi</a>, ranging from “extensible parsing through composeable PEGs with optimal performance” to Carlos Castañeda, Jesus Christ, meta-physics, religion and Pink Floyd. The <a href="http://en.wikipedia.org/wiki/Cryptonomicon">Cryptonomicon</a> really got me.</p>

<p>Got to put a face on <a href="http://forum.unity3d.com/profile.php?mode=viewprofile&u=3">Joachim</a> and see how really cool <a href="http://otee.dk/">Unity</a> is.</p>

<p>Jeroen <a href="http://weblog.ikvm.net/">IKVM</a> Frijters is a funny guy!</p>

<p>On Thursday I got to <a href="http://codehaus.org/~bamboo/MonoSummit07-db4o.pdf">talk</a> about <a href="http://www.db4o.com/">db4o</a> which led me to meet a few db4o users hanging around the conference.</p>

<blockquote>
<p>Pedro Santos had an interesting question, how to monitor and control the usage of computational resources in a managed client/server application? In other words, how a sysadmin can make sure a specific client won’t DOS the application?</p>
</blockquote>

<blockquote>
<p>For .NET servers running on Windows there are performance counters, what about Mono servers running on Linux?</p>
</blockquote>

<p>I’ve also got to spread the gospel about <a href="http://boo.codehaus.org/">boo</a> for which I got a hugely positive response.</p>

<blockquote>
<p><a href="http://ajaxwidgets.com/Blogs/thomas.bb">Thomas “Gaia” Hansen</a> seemed to really get it and so we had lots of interesting discussions on how to take over the world boo style.</p>
</blockquote>

<blockquote>
<p><a href="http://jacksonito.blogspot.com/">Jackson</a> wants to hack on better nullable type support for boo!</p>
</blockquote>

<blockquote>
<p><a href="http://schani.wordpress.com/">Mark</a> wants an extensible language where NullReferenceExceptions are impossible.</p>
</blockquote>

<blockquote>
<p><a href="http://tirania.org/blog/index.html">Miguel</a> reassured me once again mcs won’t be rewritten on top of the boo compiler infrastructure :)</p>
</blockquote>

<p>The presentation material is <a href="http://boo.codehaus.org/MonoSummit2007/">here</a>.</p>

<p>Looking forward to the next one.</p></summary>
    <content type='html' xml:lang='en' xml:base='http://bamboo.github.com'><p><img src="http://www.mono-project.com/files/4/42/Summit.png" alt="Mono Summit 2007" title="Mono Summit 2007" /></p>

<p>What a great experience.</p>

<p>A chance to interact live with a <a href="http://evain.net/blog/">dear friend</a>. Free Software, Hacking, Women, Futurama, McDonalds, love spreading, Militant Atheism, Monty Python, Douglas Adams and the French Way.</p>

<p>Had lots of interesting exchange of ideas with <a href="http://primates.ximian.com/~massi/all.html">Massi</a>, ranging from “extensible parsing through composeable PEGs with optimal performance” to Carlos Castañeda, Jesus Christ, meta-physics, religion and Pink Floyd. The <a href="http://en.wikipedia.org/wiki/Cryptonomicon">Cryptonomicon</a> really got me.</p>

<p>Got to put a face on <a href="http://forum.unity3d.com/profile.php?mode=viewprofile&u=3">Joachim</a> and see how really cool <a href="http://otee.dk/">Unity</a> is.</p>

<p>Jeroen <a href="http://weblog.ikvm.net/">IKVM</a> Frijters is a funny guy!</p>

<p>On Thursday I got to <a href="http://codehaus.org/~bamboo/MonoSummit07-db4o.pdf">talk</a> about <a href="http://www.db4o.com/">db4o</a> which led me to meet a few db4o users hanging around the conference.</p>

<blockquote>
<p>Pedro Santos had an interesting question, how to monitor and control the usage of computational resources in a managed client/server application? In other words, how a sysadmin can make sure a specific client won’t DOS the application?</p>
</blockquote>

<blockquote>
<p>For .NET servers running on Windows there are performance counters, what about Mono servers running on Linux?</p>
</blockquote>

<p>I’ve also got to spread the gospel about <a href="http://boo.codehaus.org/">boo</a> for which I got a hugely positive response.</p>

<blockquote>
<p><a href="http://ajaxwidgets.com/Blogs/thomas.bb">Thomas “Gaia” Hansen</a> seemed to really get it and so we had lots of interesting discussions on how to take over the world boo style.</p>
</blockquote>

<blockquote>
<p><a href="http://jacksonito.blogspot.com/">Jackson</a> wants to hack on better nullable type support for boo!</p>
</blockquote>

<blockquote>
<p><a href="http://schani.wordpress.com/">Mark</a> wants an extensible language where NullReferenceExceptions are impossible.</p>
</blockquote>

<blockquote>
<p><a href="http://tirania.org/blog/index.html">Miguel</a> reassured me once again mcs won’t be rewritten on top of the boo compiler infrastructure :)</p>
</blockquote>

<p>The presentation material is <a href="http://boo.codehaus.org/MonoSummit2007/">here</a>.</p>

<p>Looking forward to the next one.</p></content>
  </entry>
  
  <entry>
    <title>Introducing boojay</title>
    <link rel='alternate' type='text/html' href='http://bamboo.github.com/2007/10/23/introducing-boojay.html' />
    <id>tag:bamboo.github.com:/2007/10/23/introducing-boojay</id>
    <updated>2007-10-23T00:00:00-07:00</updated>
    <summary><div class='highlight'><pre><code class='boo'>    <span class='k'>import</span> <span class='n'>org</span><span class='p'>.</span><span class='n'>eclipse</span><span class='p'>.</span><span class='n'>swt</span>
    <span class='k'>import</span> <span class='n'>org</span><span class='p'>.</span><span class='n'>eclipse</span><span class='p'>.</span><span class='n'>swt</span><span class='p'>.</span><span class='n'>widgets</span>
    
    <span class='n'>display</span> <span class='o'>=</span> <span class='n'>Display</span><span class='p'>()</span>
    <span class='n'>shell</span> <span class='o'>=</span> <span class='n'>Shell</span><span class='p'>(</span><span class='n'>display</span><span class='p'>)</span>
    <span class='n'>shell</span><span class='p'>.</span><span class='n'>setText</span><span class='p'>(</span><span class='s2'>&quot;Hello!&quot;</span><span class='p'>)</span>
    <span class='n'>shell</span><span class='p'>.</span><span class='n'>setSize</span><span class='p'>(</span><span class='mi'>200</span><span class='p'>,</span> <span class='mi'>200</span><span class='p'>)</span>
    <span class='n'>shell</span><span class='p'>.</span><span class='n'>open</span><span class='p'>()</span>
    <span class='k'>while</span> <span class='ow'>not</span> <span class='n'>shell</span><span class='p'>.</span><span class='n'>isDisposed</span><span class='p'>():</span>
        <span class='k'>if</span> <span class='ow'>not</span> <span class='n'>display</span><span class='p'>.</span><span class='n'>readAndDispatch</span><span class='p'>():</span>
            <span class='n'>display</span><span class='p'>.</span><span class='n'>sleep</span><span class='p'>()</span>
            
    <span class='n'>display</span><span class='p'>.</span><span class='n'>dispose</span><span class='p'>()</span>
</code></pre></div>
<p>A <a href="http://boo.codehaus.org/">boo</a> application using the <a href="http://www.eclipse.org/swt/">SWT</a> java GUI library. Thanks to <a href="http://ikvm.net/">IKVM</a> that’s not only possible but very simple as well.</p>

<p>So what’s the news? Well, Friday morning I was chatting with <a href="http://www.blogger.com/profile/6652942">Klaus</a> and he said to me “if you get boo to emit java bytecodes I’ll do all my stuff in boo”. How’s that for a challenge? :)</p>

<p>Thanks again to <a href="http://ikvm.net/">IKVM</a>, <a href="http://asm.objectweb.org/">ObjectWeb ASM</a> and <a href="http://boo.codehaus.org/BooManifesto.pdf">the extensible boo pipeline architecture</a> after a weekend of relaxed hacking <a href="http://boo-extensions.googlecode.com/svn/trunk/boojay/">boojay</a> was born.</p>

<p><strong>UPDATE:</strong> Just in case it’s not clear, the generated class files <strong>DO NOT</strong> require IKVM in any way and can be executed in any compliant JVM.</p></summary>
    <content type='html' xml:lang='en' xml:base='http://bamboo.github.com'><div class='highlight'><pre><code class='boo'>    <span class='k'>import</span> <span class='n'>org</span><span class='p'>.</span><span class='n'>eclipse</span><span class='p'>.</span><span class='n'>swt</span>
    <span class='k'>import</span> <span class='n'>org</span><span class='p'>.</span><span class='n'>eclipse</span><span class='p'>.</span><span class='n'>swt</span><span class='p'>.</span><span class='n'>widgets</span>
    
    <span class='n'>display</span> <span class='o'>=</span> <span class='n'>Display</span><span class='p'>()</span>
    <span class='n'>shell</span> <span class='o'>=</span> <span class='n'>Shell</span><span class='p'>(</span><span class='n'>display</span><span class='p'>)</span>
    <span class='n'>shell</span><span class='p'>.</span><span class='n'>setText</span><span class='p'>(</span><span class='s2'>&quot;Hello!&quot;</span><span class='p'>)</span>
    <span class='n'>shell</span><span class='p'>.</span><span class='n'>setSize</span><span class='p'>(</span><span class='mi'>200</span><span class='p'>,</span> <span class='mi'>200</span><span class='p'>)</span>
    <span class='n'>shell</span><span class='p'>.</span><span class='n'>open</span><span class='p'>()</span>
    <span class='k'>while</span> <span class='ow'>not</span> <span class='n'>shell</span><span class='p'>.</span><span class='n'>isDisposed</span><span class='p'>():</span>
        <span class='k'>if</span> <span class='ow'>not</span> <span class='n'>display</span><span class='p'>.</span><span class='n'>readAndDispatch</span><span class='p'>():</span>
            <span class='n'>display</span><span class='p'>.</span><span class='n'>sleep</span><span class='p'>()</span>
            
    <span class='n'>display</span><span class='p'>.</span><span class='n'>dispose</span><span class='p'>()</span>
</code></pre></div>
<p>A <a href="http://boo.codehaus.org/">boo</a> application using the <a href="http://www.eclipse.org/swt/">SWT</a> java GUI library. Thanks to <a href="http://ikvm.net/">IKVM</a> that’s not only possible but very simple as well.</p>

<p>So what’s the news? Well, Friday morning I was chatting with <a href="http://www.blogger.com/profile/6652942">Klaus</a> and he said to me “if you get boo to emit java bytecodes I’ll do all my stuff in boo”. How’s that for a challenge? :)</p>

<p>Thanks again to <a href="http://ikvm.net/">IKVM</a>, <a href="http://asm.objectweb.org/">ObjectWeb ASM</a> and <a href="http://boo.codehaus.org/BooManifesto.pdf">the extensible boo pipeline architecture</a> after a weekend of relaxed hacking <a href="http://boo-extensions.googlecode.com/svn/trunk/boojay/">boojay</a> was born.</p>

<p><strong>UPDATE:</strong> Just in case it’s not clear, the generated class files <strong>DO NOT</strong> require IKVM in any way and can be executed in any compliant JVM.</p></content>
  </entry>
  
</feed>
