☕
Familiar
Java syntax with optional types. dyn where you want freedom, int or a class where you want checks.
The syntax of Java, the lightness of Lua, and a sandbox you control.
// welcome.jmp - the host calls onJoin when a player joins
dyn visits = table();
void onJoin(dyn player) {
visits[player.name()] = (visits[player.name()] || 0) + 1;
player.send("Welcome, " + player.name() + "! Visit " + visits[player.name()]);
server.broadcast(player.name() + " joined");
}// scripts.jma - what scripts may touch
Policy.allowPackage("example.api");
Policy.allowClass("example.api.Player").denyMethod("kick");
Policy.allowPackage("java.util");// the host
Interpreter jumper = new Interpreter()
.access(Access.load(Path.of("scripts.jma")))
.define("server", server);
Script script = jumper.script(Files.readString(Path.of("welcome.jmp")));
script.run();
script.invoke("onJoin", player);