Playing lately with some scripting languages (rhai
, rlua
, rustpython
and pyo3
) to be called from Rust I discover that each has its own implementation idiosyncrasies. With rhai
, rlua
and rustpython
at startup I can define a ScriptEngine
that holds the compiled code the interpreter and the scope so that at for each callback (script call) I can do something like:
let interpreter = ... // the code interpreter
let code = ... // the compiled code
let scope = ... // the state passed to and updated by callbacks
let se = ScriptEngine { interpreter, code, scope };
impl ScriptEnging {
pub fn act(
&mut self,
action: &str,
)
}
// ... and then somewhere else...
let result = se.call(&mut se.code, &mut se.scope, action, args);
What is the idiomatic way to do this with pyo3
? (e.g. when I try to create a interpreter I run into lifetime issues with the GIL object).