<br><br><div class="gmail_quote">On Wed, Dec 19, 2012 at 8:08 AM, Tom Hawkins <span dir="ltr">&lt;<a href="mailto:tomahawkins@gmail.com" target="_blank">tomahawkins@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">A few folks have asked me about building EDSLs in Haskell for assembly programming, so I&#39;ve posted an example of the approach we have had success using at BAE Systems.<br><div><br></div><div>It&#39;s a bit rough, so if anyone&#39;s motivated to polish it up, by all means.</div>

<div><br></div><div>  <a href="https://github.com/tomahawkins/asm-dsl-example/" target="_blank">https://github.com/tomahawkins/asm-dsl-example/</a></div></div></blockquote><div><br></div><div>Thanks. It was nice to read. I was reminded of &quot;The Monad Reader Issue 6&quot; as it explains how to &quot;tie the knot&quot; when creating labels: <a href="http://www.haskell.org/wikiupload/1/14/TMR-Issue6.pdf">http://www.haskell.org/wikiupload/1/14/TMR-Issue6.pdf</a></div>
<div><br></div><div>The Russell uses an assembly language DSL as a motivating example and explains how either Haskell98 or mdo can be used to tie the knot, with mdo giving a nicer implementation. The result allows labels to be defined where they are used instead of requiring the user to instantiate them and then associate them with a place in the program. This provides a nice abstraction for building your assembler macros.</div>
<div><br></div><div>For example, in your code we see:</div><div>\begin{code}</div><div><pre style="margin-top:0px;margin-bottom:0px;padding:0px;border:0px;font-size:12px;font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;color:rgb(51,51,51);line-height:16px">
<div class="line" id="LC139" style="margin:0px;padding:0px 0px 0px 10px;border:0px"><span class="nf" style="margin:0px;padding:0px;border:0px;color:rgb(153,0,0);font-weight:bold">testProgram</span> <span class="ow" style="margin:0px;padding:0px;border:0px;font-weight:bold">::</span> <span class="kt" style="margin:0px;padding:0px;border:0px;color:rgb(68,85,136);font-weight:bold">Asm</span> <span class="nb" style="margin:0px;padding:0px;border:0px;color:rgb(0,134,179)">()</span></div>
<div class="line" id="LC140" style="margin:0px;padding:0px 0px 0px 10px;border:0px"><span class="nf" style="margin:0px;padding:0px;border:0px;color:rgb(153,0,0);font-weight:bold">testProgram</span> <span class="ow" style="margin:0px;padding:0px;border:0px;font-weight:bold">=</span> <span class="kr" style="margin:0px;padding:0px;border:0px;font-weight:bold">do</span></div>
<div class="line" id="LC141" style="margin:0px;padding:0px 0px 0px 10px;border:0px">  <span class="n" style="margin:0px;padding:0px;border:0px">begin</span> <span class="ow" style="margin:0px;padding:0px;border:0px;font-weight:bold">&lt;-</span> <span class="n" style="margin:0px;padding:0px;border:0px">label</span></div>
<div class="line" id="LC142" style="margin:0px;padding:0px 0px 0px 10px;border:0px">  <span class="n" style="margin:0px;padding:0px;border:0px">loop</span>  <span class="ow" style="margin:0px;padding:0px;border:0px;font-weight:bold">&lt;-</span> <span class="n" style="margin:0px;padding:0px;border:0px">label</span></div>
<div class="line" id="LC143" style="margin:0px;padding:0px 0px 0px 10px;border:0px">  <span class="n" style="margin:0px;padding:0px;border:0px">begin</span> <span class="o" style="margin:0px;padding:0px;border:0px;font-weight:bold">-:</span> <span class="kr" style="margin:0px;padding:0px;border:0px;font-weight:bold">do</span></div>
<div class="line" id="LC144" style="margin:0px;padding:0px 0px 0px 10px;border:0px">    <span class="n" style="margin:0px;padding:0px;border:0px">i1</span> <span class="mi" style="margin:0px;padding:0px;border:0px;color:rgb(0,153,153)">10</span> <span class="mi" style="margin:0px;padding:0px;border:0px;color:rgb(0,153,153)">20</span></div>
<div class="line" id="LC145" style="margin:0px;padding:0px 0px 0px 10px;border:0px">    <span class="n" style="margin:0px;padding:0px;border:0px">i2</span></div><div class="line" id="LC146" style="margin:0px;padding:0px 0px 0px 10px;border:0px">
    <span class="n" style="margin:0px;padding:0px;border:0px">i3</span> <span class="mi" style="margin:0px;padding:0px;border:0px;color:rgb(0,153,153)">5</span></div><div class="line" id="LC147" style="margin:0px;padding:0px 0px 0px 10px;border:0px">
  <span class="n" style="margin:0px;padding:0px;border:0px">loop</span> <span class="o" style="margin:0px;padding:0px;border:0px;font-weight:bold">-:</span> <span class="kr" style="margin:0px;padding:0px;border:0px;font-weight:bold">do</span></div>
<div class="line" id="LC148" style="margin:0px;padding:0px 0px 0px 10px;border:0px">    <span class="n" style="margin:0px;padding:0px;border:0px">i4</span></div><div class="line" id="LC149" style="margin:0px;padding:0px 0px 0px 10px;border:0px">
    <span class="n" style="margin:0px;padding:0px;border:0px">goto</span> <span class="n" style="margin:0px;padding:0px;border:0px">loop</span></div></pre></div><div>\end{code}</div><div><br></div><div>The corresponding code using the TMR trick might look like this (I&#39;ve removed the nested indentation):</div>
<div>\begin{code}</div><div><pre style="margin-top:0px;margin-bottom:0px;padding:0px;border:0px;font-size:12px;font-family:Consolas,&#39;Liberation Mono&#39;,Courier,monospace;color:rgb(51,51,51);line-height:16px"><div class="line" id="LC139" style="margin:0px;padding:0px 0px 0px 10px;border:0px">
<span class="nf" style="margin:0px;padding:0px;border:0px;color:rgb(153,0,0);font-weight:bold">testProgram</span> <span class="ow" style="margin:0px;padding:0px;border:0px;font-weight:bold">::</span> <span class="kt" style="margin:0px;padding:0px;border:0px;color:rgb(68,85,136);font-weight:bold">Asm</span> <span class="nb" style="margin:0px;padding:0px;border:0px;color:rgb(0,134,179)">()</span></div>
<div class="line" id="LC140" style="margin:0px;padding:0px 0px 0px 10px;border:0px"><span class="nf" style="margin:0px;padding:0px;border:0px;color:rgb(153,0,0);font-weight:bold">testProgram</span> <span class="ow" style="margin:0px;padding:0px;border:0px;font-weight:bold">=</span> m<span class="kr" style="margin:0px;padding:0px;border:0px;font-weight:bold">do</span></div>
<div class="line" id="LC141" style="margin:0px;padding:0px 0px 0px 10px;border:0px">  begin &lt;- label</div><div class="line" id="LC144" style="margin:0px;padding:0px 0px 0px 10px;border:0px">  <span class="n" style="margin:0px;padding:0px;border:0px">i1</span> <span class="mi" style="margin:0px;padding:0px;border:0px;color:rgb(0,153,153)">10</span> <span class="mi" style="margin:0px;padding:0px;border:0px;color:rgb(0,153,153)">20</span></div>
<div class="line" id="LC145" style="margin:0px;padding:0px 0px 0px 10px;border:0px">  <span class="n" style="margin:0px;padding:0px;border:0px">i2</span></div><div class="line" id="LC146" style="margin:0px;padding:0px 0px 0px 10px;border:0px">
  <span class="n" style="margin:0px;padding:0px;border:0px">i3</span> <span class="mi" style="margin:0px;padding:0px;border:0px;color:rgb(0,153,153)">5</span></div><div class="line" id="LC146" style="margin:0px;padding:0px 0px 0px 10px;border:0px">
<span class="mi" style="margin:0px;padding:0px;border:0px;color:rgb(0,153,153)">  </span><span class="n" style="margin:0px;padding:0px;border:0px">loop</span>  <span class="ow" style="margin:0px;padding:0px;border:0px;font-weight:bold">&lt;-</span> <span class="n" style="margin:0px;padding:0px;border:0px">label</span></div>
<div class="line" id="LC148" style="margin:0px;padding:0px 0px 0px 10px;border:0px">  <span class="n" style="margin:0px;padding:0px;border:0px">i4</span></div><div class="line" id="LC149" style="margin:0px;padding:0px 0px 0px 10px;border:0px">
  <span class="n" style="margin:0px;padding:0px;border:0px">goto</span> <span class="n" style="margin:0px;padding:0px;border:0px">loop</span></div></pre></div><div>\end{code}</div><div><br></div><div>Other examples demonstrate that labels can be referenced before the line that creates them due to the way mdo works.</div>
<div><br></div><div>Jason</div><div><br></div></div>