<div dir="ltr">Hi Henry<div><br></div><div>I'm taking a similar approach to Galler for a proof-of-concept, but without the macrology. This should make the ideas more widely accessible (and my skill with macros is limited).</div>


<div><br></div><div>First, thank-you again for supplying the example. By comparing input and output readers can infer the kinds of things your DSL does, even with only a smattering of Forth.</div><div><br></div><div>The first thing to do is to devise a more Lispy representation of the DSL. Let's take the original:</div>


<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><span style="font-family:arial,sans-serif;font-size:13px">: NAME S"John Doe"</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">   CU4</span></div>


<div><span style="font-family:arial,sans-serif;font-size:13px">   HCTZ25 30P 1CPM</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">   OMZ20 30P 1CPM INSTOMZ</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">   SIMVA20 30P 1CPN</span></div>


<div><span style="font-family:arial,sans-serif;font-size:13px">   L/D;</span></div></blockquote><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">and re-cast it using parentheses and prefix notation. I've chosen to notate as follows, adapting from Galler:</span></div>


<div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="arial, sans-serif">'(script</font></div></div>


<div><div><font face="arial, sans-serif">  (name "John Doe")</font></div></div><div><div><font face="arial, sans-serif">  (directions (CU 4))</font></div></div><div><div><font face="arial, sans-serif">  (medication (HCTZ 25) (P 30) (CPM 1))</font></div>


</div><div><div><font face="arial, sans-serif">  (medication (OMZ 20) (P 30) (CPM 1) (INSTOMZ))</font></div></div><div><div><font face="arial, sans-serif">  (medication (SIMVA 20) (P 30) (CPN 1)))</font></div>
</div></blockquote><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">[I've left off the L/D because I didn't follow the mapping, but you get the idea.]</font></div>
<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Now -- in practice -- a physician doesn't want to fiddle with parentheses, so a simple parser (16 lines in the proof-of-concept) is needed to go from something close to the original DSL to the new, parenthesized DSL.</font></div>


<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">From this new DSL there are many ways to get to the expanded script. Because it keeps coming up (and it's a quick hack ;-) I've used eval. A simple desugaring approach (as described in Shriram's PLAI book and course) would also work well, IMO.</font></div>


<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Here's my proof-of-concept in action...</font></div><div><br></div><div>Input:</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">


<div><div>(shorthand->script</div></div><div><div>"John Doe</div></div><div><div>CU4</div></div><div><div>HCTZ25 30P 1CPM</div></div><div><div>OMZ20 30P 1CPM INSTOMZ</div></div><div><div>SIMVA20 30P 1CPN")</div>


</div></blockquote><div><br></div><div>Output:</div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div>John Doe</div><div><br></div><div>Continuous use - 4 months</div><div><br></div><div>

Hydrochlorothiazide 25mg ---------------- 30 pills</div>
<div><br></div><div>    Take 1 pill in the morning.</div><div><br></div><div>Omeprazol 20mg ---------------- 30 pills</div><div><br></div><div>    Take 1 pill in the morning, 1/2 hour before breakfast.</div><div><br></div>


<div>Simvastatin 20mg ---------------- 30 pills</div><div><br></div><div>    Take 1 pill at night.</div></div></blockquote></div><div><br></div><div>Code pasted here: <a href="http://pasterack.org/pastes/67082" target="_blank">http://pasterack.org/pastes/67082</a></div>


<div><br></div><div>To summarize:</div><div><ol><li>Design the Lispy version of the DSL</li><li>Parse from the input DSL to the Lispy DSL</li><li>Expand from the Lispy DSL to the full script</li><li>Bells and whistles: graphics, file-handling, proper user-interface, error-handling, etc.</li>


</ol><div>I hope that helps.</div><div><br></div><div>I think this would be a good open-source project, and well-suited to Racket. </div><div><br></div><div>BTW: If you want to produce nicely type-set output, consider looking into the Scribble language / tool.</div>

</div><div><br></div><div class="gmail_extra">Dan<div dir="ltr"></div>
</div></div>