• JSR 223 API

    From =?UTF-8?Q?Arne_Vajh=c3=b8j?=@21:1/5 to All on Fri Apr 21 10:42:05 2023
    I have posted some examples of usage of JSR 223 API
    (scripting engines) in comp.os.vms and I will
    post them here as well just in case someone ever need
    to find such examples (there is not that much
    available on the net).

    Required libs to run all: abcl, bsh, groovy, jacl, jruby, jython,
    luaj, perlito5 and quercus (but in most practical cases
    you would only need lib for one language).

    Arne

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;

    public class EmbeddedScript {
    public static void test(String language, String source) throws ScriptException {
    System.out.println(language + ":");
    System.out.print(source);
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine se = sem.getEngineByName(language);
    se.eval(source);
    }
    public static void main(String[] args) throws ScriptException {
    test("javascript", "for(i = 0; i < 3; i++) {\r\n" +
    " print(\"Hi from JavaScript!\")\r\n" +
    "}\r\n");
    test("python", "for i in range(3):\r\n" +
    " print(\"Hi from Python!\")\r\n");
    test("ruby", "for i in 1..3 do\r\n" +
    " puts 'Hi from Ruby!'\r\n" +
    "end\r\n");
    test("php", "<?php\r\n" +
    "for($i = 0; $i < 3; $i++) {\r\n" +
    " echo \"Hi from PHP!\\r\\n\";\r\n" +
    "}\r\n" +
    "?>\r\n");
    test("groovy", "for(i in 1..3) {\r\n" +
    " println \"Hi from Groovy!\"\r\n" +
    "}\r\n");
    test("beanshell", "for(int i = 0; i < 3; i++) {\r\n" +
    " System.out.println(\"Hi from BeanShell!\");\r\n"+
    "}\r\n");
    test("perl", "for(1..3) {\r\n" +
    " print(\"Hi from Perl!\\n\");\r\n" +
    "}\r\n");
    test("lua", "for i = 1,3\r\n" +
    "do\r\n" +
    " print(\"Hi from Lua!\")\r\n" +
    "end\r\n");
    test("Lisp", "(dotimes (n 3)\r\n" +
    " (format t \"Hi from Lisp!~%\"))\r\n");
    test("tcl", "for {set i 0} {$i < 3} {incr i} {\r\n" +
    " puts \"Hi from Tcl!\"\r\n" +
    "}\r\n");
    }
    }

    Output:

    javascript:
    for(i = 0; i < 3; i++) {
    print("Hi from JavaScript!")
    }
    Hi from JavaScript!
    Hi from JavaScript!
    Hi from JavaScript!
    python:
    for i in range(3):
    print("Hi from Python!")
    Hi from Python!
    Hi from Python!
    Hi from Python!
    ruby:
    for i in 1..3 do
    puts 'Hi from Ruby!'
    end
    Hi from Ruby!
    Hi from Ruby!
    Hi from Ruby!
    php:
    <?php
    for($i = 0; $i < 3; $i++) {
    echo "Hi from PHP!\r\n";
    }

    Hi from PHP!
    Hi from PHP!
    Hi from PHP!
    groovy:
    for(i in 1..3) {
    println "Hi from Groovy!"
    }
    Hi from Groovy!
    Hi from Groovy!
    Hi from Groovy!
    beanshell:
    for(int i = 0; i < 3; i++) {
    System.out.println("Hi from BeanShell!");
    }
    Hi from BeanShell!
    Hi from BeanShell!
    Hi from BeanShell!
    perl:
    for(1..3) {
    print("Hi from Perl!\n");
    }
    Hi from Perl!
    Hi from Perl!
    Hi from Perl!
    lua:
    for i = 1,3
    do
    print("Hi from Lua!")
    end
    Hi from Lua!
    Hi from Lua!
    Hi from Lua!
    Lisp:
    (dotimes (n 3)
    (format t "Hi from Lisp!~%"))
    Hi from Lisp!
    Hi from Lisp!
    Hi from Lisp!
    tcl:
    for {set i 0} {$i < 3} {incr i} {
    puts "Hi from Tcl!"
    }
    Hi from Tcl!
    Hi from Tcl!
    Hi from Tcl!

    import javax.script.ScriptContext;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    import javax.script.SimpleScriptContext;

    import org.luaj.vm2.script.LuajContext;

    public class EmbeddedScript2 {
    public static class Data {
    public int iv;
    public String sv;
    public Data(int iv, String sv) {
    this.iv = iv;
    this.sv = sv;
    }
    public void m() {
    iv++;
    sv += "X";
    }
    @Override
    public String toString() {
    return String.format("(%d,%s)", iv, sv);
    }
    }
    public static void test(String language, String source) throws ScriptException {
    System.out.println(language + ":");
    System.out.print(source);
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine se = sem.getEngineByName(language);
    ScriptContext ctx;
    switch(language) {
    case "lua":
    ctx = new LuajContext(); // LuaJ insist on getting a LuajContext which is actually a sub class of SimpleScriptContext
    break;
    default:
    ctx = new SimpleScriptContext();
    break;
    }
    ctx.setAttribute("n", 3, ScriptContext.ENGINE_SCOPE);
    ctx.setAttribute("o", new Data(123, "ABC"), ScriptContext.ENGINE_SCOPE);
    se.eval(source, ctx);
    Data o = (Data)ctx.getAttribute("o");
    System.out.println(o);
    }
    public static void main(String[] args) throws ScriptException {
    test("javascript", "for(i = 0; i < n; i++) {\r\n" +
    " print(\"Hi from JavaScript!\")\r\n" +
    "}\r\n" +
    "o.iv = o.iv + 1;\r\n" +
    "o.sv = o.sv + \"X\";\r\n" +
    "o.m();\r\n");
    test("python", "for i in range(n):\r\n" +
    " print(\"Hi from Python!\")\r\n" +
    "o.iv = o.iv + 1\r\n" +
    "o.sv = o.sv + 'X'\r\n" +
    "o.m()\r\n");
    test("ruby", "for i in 1..n do\r\n" +
    " puts 'Hi from Ruby!'\r\n" +
    "end\r\n" +
    "o.iv = o.iv + 1\r\n" +
    "o.sv = o.sv + 'X'\r\n" +
    "o.m()\r\n");
    test("php", "<?php\r\n" +
    "for($i = 0; $i < $n; $i++) {\r\n" +
    " echo \"Hi from PHP!\\r\\n\";\r\n" +
    "}\r\n" +
    "$o->iv = $o->iv + 1;\r\n" +
    "$o->sv = $o->sv . 'X';\r\n" +
    "$o->m();\r\n" +
    "?>\r\n");
    test("groovy", "for(i in 1..n) {\r\n" +
    " println \"Hi from Groovy!\"\r\n" +
    "}\r\n" +
    "o.iv = o.iv + 1\r\n" +
    "o.sv = o.sv + \"X\"\r\n" +
    "o.m()\r\n");
    test("beanshell", "for(int i = 0; i < n; i++) {\r\n" +
    " System.out.println(\"Hi from BeanShell!\");\r\n"+
    "}\r\n" +
    "o.iv = o.iv + 1;\r\n" +
    "o.sv = o.sv + \"X\";\r\n" +
    "o.m();\r\n");
    // I cannot get perlito5 to work with context
    test("lua", "for i = 1,n\r\n" +
    "do\r\n" +
    " print(\"Hi from Lua!\")\r\n" +
    "end\r\n" +
    "o.iv = o.iv + 1\r\n" +
    "o.sv = o.sv .. \"X\"\r\n" +
    "o:m()\r\n");
    test("Lisp", "(dotimes (n n)\r\n" +
    " (format t \"Hi from Lisp!~%\"))\r\n" +
    "(setf (jfield \"iv\" o) (+ (jfield \"iv\" o)
    1))\r\n" +
    "(setf (jfield \"sv\" o) (concatenate 'string
    (jfield \"sv\" o) \"X\"))\r\n" +
    "(jcall \"m\" o)\r\n");
    // I cannot get jacl to work with context
    }
    }

    Output:

    javascript:
    for(i = 0; i < n; i++) {
    print("Hi from JavaScript!")
    }
    o.iv = o.iv + 1;
    o.sv = o.sv + "X";
    o.m();
    Hi from JavaScript!
    Hi from JavaScript!
    Hi from JavaScript!
    (125,ABCXX)
    python:
    for i in range(n):
    print("Hi from Python!")
    o.iv = o.iv + 1
    o.sv = o.sv + 'X'
    o.m()
    Hi from Python!
    Hi from Python!
    Hi from Python!
    (125,ABCXX)
    ruby:
    for i in 1..n do
    puts 'Hi from Ruby!'
    end
    o.iv = o.iv + 1
    o.sv = o.sv + 'X'
    o.m()
    Hi from Ruby!
    Hi from Ruby!
    Hi from Ruby!
    (125,ABCXX)
    php:
    <?php
    for($i = 0; $i < $n; $i++) {
    echo "Hi from PHP!\r\n";
    }
    iv = $o->iv + 1;
    sv = $o->sv . 'X';
    m();

    Hi from PHP!
    Hi from PHP!
    Hi from PHP!
    (125,ABCXX)
    groovy:
    for(i in 1..n) {
    println "Hi from Groovy!"
    }
    o.iv = o.iv + 1
    o.sv = o.sv + "X"
    o.m()
    Hi from Groovy!
    Hi from Groovy!
    Hi from Groovy!
    (125,ABCXX)
    beanshell:
    for(int i = 0; i < n; i++) {
    System.out.println("Hi from BeanShell!");
    }
    o.iv = o.iv + 1;
    o.sv = o.sv + "X";
    o.m();
    Hi from BeanShell!
    Hi from BeanShell!
    Hi from BeanShell!
    (125,ABCXX)
    lua:
    for i = 1,n
    do
    print("Hi from Lua!")
    end
    o.iv = o.iv + 1
    o.sv = o.sv .. "X"
    o:m()
    Hi from Lua!
    Hi from Lua!
    Hi from Lua!
    (125,ABCXX)
    Lisp:
    (dotimes (n n)
    (format t "Hi from Lisp!~%"))
    (setf (jfield "iv" o) (+ (jfield "iv" o) 1))
    (setf (jfield "sv" o) (concatenate 'string (jfield "sv" o) "X"))
    (jcall "m" o)
    Hi from Lisp!
    Hi from Lisp!
    Hi from Lisp!
    (125,ABCXX)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)