I just discovered the JavaScript console (jrunscript) inside JDK6. Pretty nifty for running quick-and-dirty tests. Or so I thought until I ran into a bizarre problem with that most exotic of classes, java.lang.String.
I haven't blogged for a while, but I have plausible deniability. We just got twins.

Today, I discovered the JavaScript console in JDK6. From a command shell, run jrunscript (assuming, of course, that you have $JAVA_HOME/bin on your path). You get a JavaScript interpreter that lets you script Java classes. For example, try this little program:
importPackage(Packages.javax.swing);
frame = new JFrame();
label = new JLabel("Hello, World");
frame.add(label);
frame.setSize(200, 100);
frame.setVisible(true);
You get a GUI "Hello, World" program. Pretty nifty--no fussing with type declarations or the dreaded public static void main.

It works even better inside Emacs, with shell mode.

I am not smart enough to get regular expressions right on the first try, and I usually write a trivial Java program, complete with public static void main, to test them out before plugging them into a bigger program. When I discovered the JavaScript console, I figured that I no longer had to do that. Just fire up jrunscript and try it out:
js> Arrays.toString("foo bar".split(" "));
script error: sun.org.mozilla.javascript.internal.EvaluatorException: The choice of Java constructor toString matching JavaScript argument types (object) is ambiguous; candidate constructors are:
class java.lang.String toString(long[])
class java.lang.String toString(int[])
class java.lang.String toString(short[])
class java.lang.String toString(char[])
class java.lang.String toString(byte[])
class java.lang.String toString(boolean[])
class java.lang.String toString(float[])
class java.lang.String toString(double[])
class java.lang.String toString(java.lang.Object[]) (<STDIN>#1) in <STDIN> at line number 1
Ok, whatever.
js> Arrays.asList("foo bar".split(" "));
[foo, bar]
Good--that worked. What about arbitrary white space:
js> Arrays.asList("foo bar".split("\\s+"));
[foo bar]
WTH? Why didn't it split? Do I need one backslash? Four backslashes?
js> Arrays.asList("foo bar".split("\s+"));
[foo bar]
js> Arrays.asList("foo bar".split("\\\\s+"));
[foo bar]
Arggh. Back to good old public static void main:
import java.util.*;
public class Test {
public static void main(String[] args) throws Exception {
System.out.println(Arrays.asList("foo bar".split("\\s+")));
}
}
The output is, of course,
[foo, bar]
Why doesn't this work in JavaScript? Perhaps JavaScript's strings aren't the same as Java String objects? Finally, I tried
js> Arrays.asList(new java.lang.String("foo bar").split("\\s+"));
[foo, bar]
Sweet success. But I am not sure I understand what is going on.
I often hear about the productivity gains of scripting languages, but I am not left with the warm and fuzzy feeling that the JavaScript console will save me time in the future.