Looking at some of the recent tutorials on building and using languages in Racket, I was prompted to wonder what I&#39;d have to do in order to take an existing module (in its own file) and evaluate it with a language other than the one it is specified to use, without modifying the module&#39;s original source file.  E.g., take a BSL module containing<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><font color="#000099">;; hi : String -&gt; String</font></div><div><font color="#000099">(define (hi person) (string-append &quot;Hi, &quot; person &quot;!&quot;))</font></div></blockquote><div>and evaluate it in a different language.</div>
<div><br></div><div>This is what I&#39;ve come up with so far, which seems to do the trick:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="courier new, monospace" color="#000099">(require racket/sandbox)</font></div>
<div><font face="courier new, monospace" color="#000099">;; </font><span style="color:rgb(0,0,153);font-family:&#39;courier new&#39;,monospace">mod-path-&gt;evaluator : path module-path -&gt; (any -&gt; any)</span></div><div>
<font face="courier new, monospace" color="#000099">(define (mod-path-&gt;evaluator p replacement-lang)</font></div><div><font face="courier new, monospace" color="#000099">  (parameterize ([read-accept-reader #t])</font></div>
<div><font face="courier new, monospace" color="#000099">    (let ([mod (read (open-input-file p))])</font></div><div><font face="courier new, monospace" color="#000099">      (match mod</font></div><div><font face="courier new, monospace" color="#000099">        [(list &#39;module name lang body ...)</font></div>
<div><font face="courier new, monospace" color="#000099">         (make-module-evaluator</font></div><div><font face="courier new, monospace" color="#000099">          `(module ,name ,replacement-lang ,@body))]))))</font></div>
</blockquote><div><br></div><div>The explicitness of destructuring and rebuilding of the module bugs me a bit, but assuming that <font face="courier new, monospace" color="#000099">replacement-lang</font><b> </b>defines all the forms used in the module&#39;s intended language, is this more or less the way that those of you who have built plenty of languages in Racket would do it?  Any suggested improvements?</div>
<div><br></div><div>That said, it&#39;s still pretty neat to see how easily this was done once I found the necessary parts.</div><div><br></div><div>jmj</div><div><br></div>