Hi there !<div><br></div><div>I am working on an open source software called Rubyk (real-time signal processing for art, <a href="http://rubyk.org">http://rubyk.org</a>) which currently supports Lua and other specialized DSL scripting.</div>
<div><br></div><div>The scripts send and receive messages and should be totally encapsulated (concurrency, network transparency, etc). This works well with Lua, each script having it&#39;s own execution context (VM). This is important because many objects can run concurrently and a processing tree can be &quot;encapsulated&quot; as a new class with just a couple of inlets and outlets. Example of a runtime system to filter midi events depending on video feedback:</div>
<div><br></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">[VideoIn]---&gt; [feature extractor (Lua)]</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                |</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                v</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">[MidiIn] ---&gt; [midi filter (Lua)] ---&gt; [MidiOut]</font></div>
<div><br></div><div>If the VM is global, even if we lock execution to protect state, the fact that the state is shared will produce unexpected results if the user happens to use the same global names in different objects (scripts).</div>
<div><br></div><div>So my question is twofold:</div><div><br></div><div>1. (ideal solution) Is it possible to have many Racket execution contexts (VM) in the same process ?</div><div>2. (global lock solution) If not, is it possible to protect contexts through namespaces or other tricks ?</div>
<div><br></div><div>Thanks for any advice,</div><div><br></div><div>Gaspard</div>