<br><br><div class="gmail_quote">On Wed, Dec 19, 2012 at 8:08 AM, Tom Hawkins <span dir="ltr"><<a href="mailto:tomahawkins@gmail.com" target="_blank">tomahawkins@gmail.com</a>></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've posted an example of the approach we have had success using at BAE Systems.<br><div><br></div><div>It's a bit rough, so if anyone'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 "The Monad Reader Issue 6" as it explains how to "tie the knot" 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,'Liberation Mono',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"><-</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"><-</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'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,'Liberation Mono',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 <- 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"><-</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>