Executing JavaScript on the JVM
===============================

As you will see in subsequent sections, navigating and manipulating
the JVM's class and object structure can result in verbose and
cumbersome Python code. Therefore, *jtypes.javabridge* ships with
the JavaScript interpreter Rhino, which runs on the JVM.
In many cases, the most convienient way to interact with the JVM is
to execute a piece of JavaScript.

.. autofunction:: jt.javabridge.run_script

For more information on using Rhino with the JVM see
https://developer.mozilla.org/en-US/docs/Rhino/Scripting_Java

Examples:

    >>> from jt import javabridge
    >>> javabridge.run_script("2 + 2")
    4

    >>> javabridge.run_script("a + b", bindings_in={"a": 2, "b": 3})
    5

    >>> outputs = {"result": None}
    >>> javabridge.run_script("var result = 2 + 2;", bindings_out=outputs)
    >>> outputs["result"]
    4
    
    >>> javabridge.run_script("java.lang.Math.abs(v)", bindings_in=dict(v=-1.5))
    1.5

A conversion is necessary when converting from Python primitives and objects
to Java and JavaScript primitives and objects. Python primitives are boxed into
Java objects - Javascript will automatically unbox them when calling a method
that takes primitive arguments (e.g. the call to Math.abs(double) as in the
above example. The following is a table of bidirectional translations from
Python to Java / Javascript and vice-versa:

+-------------------------+------------------------+----------------------+
| Python                  | Java - boxed           | Java-primitive       |
+=========================+========================+======================+
| bool                    | java.lang.Boolean      | boolean              |
+-------------------------+------------------------+----------------------+
| int                     | java.lang.Integer      | int                  |
+-------------------------+------------------------+----------------------+
| long                    | java.lang.Long         | long                 |
+-------------------------+------------------------+----------------------+
| float                   | java.lang.Double       | double               |
+-------------------------+------------------------+----------------------+
| unicode                 | java.lang.String       | N/A                  |
+-------------------------+------------------------+----------------------+
| str (Python->java only) | java.lang.String       | N/A                  |
+-------------------------+------------------------+----------------------+
| None                    | null                   | N/A                  |
+-------------------------+------------------------+----------------------+
