!636 //!* constructors //!class JavaTok !L !quicknew !standard functions //!multi-line strings !699 // improved multi-line strings !include #1000353 // class JavaTok main { static Object in; static new (Hash)Map functions; interface Function { public Object process(Object[] args); } static class Call { String function; String[] args; Object eval() { return functions.get(function).process(args); } public String toString() { new StringBuilder buf; for (int i = 0; i < args.length; i++) { if (i != 0) buf.append(", "); buf.append(quote(args[i])); } return function + "(" + buf + ")"; } } psvm { in = [[contains("", "")]]; parseAsJavaExpression(); replaceStringConstant("", "#681"); replaceStringConstant("", "#1000384"); loadSnippetID1(); // replace contains(x, y) with contains(toLines(x), y) // use standard function "contains(List, Object)" functions.put("contains", new Function() { public Object process(Object[] args) { return toLinesTrim((String) args[0]).contains(args[1]); } }); System.out.println("Result: " + ((Call) in).eval()); } static void parseAsJavaExpression() { L tok = JavaTok.split((String) in); new Call c; c.function = tok.get(1); c.args = new String[] { unquote(tok.get(5)), unquote(tok.get(9)) }; in = c; } static void replaceStringConstant(String before, String now) { Call c = (Call) in; new Call c2; c2.function = c.function; c2.args = new String[c.args.length]; for (int i = 0; i < c.args.length; i++) c2.args[i] = c.args[i].equals(before) ? now : c.args[i]; in = c2; } static void loadSnippetID1() tex { Call c = (Call) in; new Call c2; c2.function = c.function; c2.args = new String[c.args.length]; System.arraycopy(c.args, 0, c2.args, 0, c.args.length); for (int i = 0; i < c.args.length; i++) if (c.args[i].startsWith("#") && isSnippetID(c.args[i])) { c2.args[i] = loadSnippet(c.args[i]); break; } in = c2; } }