diff --git a/ChangeLog b/ChangeLog index 5de123cf9..ca8592d4f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ +-Java +-- implemented string match in list context 9.016 cpan:Perlito5 2015-12-21 - Docs: diff --git a/perlito5.pl b/perlito5.pl index 6e2cc8049..8d96921e9 100644 --- a/perlito5.pl +++ b/perlito5.pl @@ -2,7 +2,7 @@ use v5.10; use feature 'say'; -# Do not edit this file - Generated by Perlito5 9.015 +# Do not edit this file - Generated by Perlito5 9.016 { package main; @@ -17251,7 +17251,7 @@ $class->{'import'} ? 'import ' . $class->{'import'} . ';' . chr(10) : () } values(%java_classes))) . 'class PlControlException extends RuntimeException {' . chr(10) . '}' . chr(10) . 'class PlNextException extends PlControlException {' . chr(10) . ' public int label_id;' . chr(10) . chr(10) . ' public PlNextException(int i) {' . chr(10) . ' this.label_id = i;' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlLastException extends PlControlException {' . chr(10) . ' public int label_id;' . chr(10) . chr(10) . ' public PlLastException(int i) {' . chr(10) . ' this.label_id = i;' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlRedoException extends PlControlException {' . chr(10) . ' public int label_id;' . chr(10) . chr(10) . ' public PlRedoException(int i) {' . chr(10) . ' this.label_id = i;' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlReturnException extends PlControlException {' . chr(10) . ' public PlObject ret;' . chr(10) . chr(10) . ' public PlReturnException(PlObject ret) {' . chr(10) . ' this.ret = ret;' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlDieException extends PlControlException {' . chr(10) . ' public PlObject ret;' . chr(10) . chr(10) . ' public PlDieException(PlObject ret) {' . chr(10) . ' this.ret = ret;' . chr(10) . ' }' . chr(10) . ' public String getMessage() {' . chr(10) . ' return this.ret.toString();' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlCx {' . chr(10) . ' public static final int VOID = 0;' . chr(10) . ' public static final int SCALAR = 1;' . chr(10) . ' public static final int LIST = 2;' . chr(10) . ' public static final PlUndef UNDEF = new PlUndef();' . chr(10) . ' public static final PlBool TRUE = new PlBool(true);' . chr(10) . ' public static final PlBool FALSE = new PlBool(false);' . chr(10) . ' public static final PlString STDOUT = new PlString("STDOUT");' . chr(10) . ' public static final PlString STDERR = new PlString("STDERR");' . chr(10) . ' public static final PlString STDIN = new PlString("STDIN");' . chr(10) . ' public static final PlString DIED = new PlString("Died");' . chr(10) . ' public static final PlString EMPTY = new PlString("");' . chr(10) . ' public static final String ARGV = "main|List_ARGV";' . chr(10) . ' public static final String ENV = "main|Hash_ENV";' . chr(10) . ' public static final PlNextException NEXT = new PlNextException(0);' . chr(10) . ' public static final PlLastException LAST = new PlLastException(0);' . chr(10) . chr(10) . ' ' . join(chr(10) . ' ', map { 'public static final PlInt ' . ($_ < 0 ? 'MIN' : 'INT') . abs($_) . ' = new PlInt(' . $_ . ');' - } (-2 .. 2)) . chr(10) . ' ' . join(chr(10) . ' ', @{$args{'java_constants'} // []}) . chr(10) . '}' . chr(10) . 'class PlCORE {' . chr(10) . ' public static final PlObject print(int want, PlObject filehandle, PlArray List__) {' . chr(10) . ' // TODO - write to filehandle' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' System.out.print(List__.aget(i).toString());' . chr(10) . ' }' . chr(10) . ' return PlCx.INT1;' . chr(10) . ' }' . chr(10) . ' public static final PlObject say(int want, PlObject filehandle, PlArray List__) {' . chr(10) . ' // TODO - write to filehandle' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' System.out.print(List__.aget(i).toString());' . chr(10) . ' }' . chr(10) . ' System.out.println("");' . chr(10) . ' return PlCx.INT1;' . chr(10) . ' }' . chr(10) . ' public static final PlObject say(String s) {' . chr(10) . ' // say() shortcut' . chr(10) . ' return PlCORE.say(PlCx.VOID, PlCx.STDOUT, new PlArray(new PlString(s)));' . chr(10) . ' }' . chr(10) . ' public static final PlObject exit(int want, PlArray List__) {' . chr(10) . ' int arg = List__.aget(0).to_int();' . chr(10) . ' System.exit(arg);' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' public static final PlObject warn(int want, PlArray List__) {' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' System.err.print(List__.aget(i).toString());' . chr(10) . ' }' . chr(10) . ' System.err.println("");' . chr(10) . ' return PlCx.INT1;' . chr(10) . ' }' . chr(10) . ' public static final PlObject die(int want, PlArray List__) {' . chr(10) . ' PlObject arg = List__.aget(0);' . chr(10) . ' if (arg.is_undef() || (arg.is_string() && arg.toString() == "")) {' . chr(10) . ' throw new PlDieException(PlCx.DIED);' . chr(10) . ' }' . chr(10) . ' if (List__.to_int() == 1) {' . chr(10) . ' throw new PlDieException(arg);' . chr(10) . ' }' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' String item = List__.aget(i).toString();' . chr(10) . ' sb.append(item);' . chr(10) . ' }' . chr(10) . ' throw new PlDieException(new PlString(sb.toString()));' . chr(10) . ' }' . chr(10) . ' public static final PlObject die(String s) {' . chr(10) . ' // die() shortcut' . chr(10) . ' return PlCORE.die(PlCx.VOID, new PlArray(new PlString(s)));' . chr(10) . ' }' . chr(10) . ' public static final PlObject ref(int want, PlArray List__) {' . chr(10) . ' return List__.aget(0).ref();' . chr(10) . ' }' . chr(10) . ' public static final PlObject values(int want, PlObject List__) {' . chr(10) . ' return want == PlCx.LIST ? List__.values() : List__.values().scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject keys(int want, PlObject List__) {' . chr(10) . ' return want == PlCx.LIST ? List__.keys() : List__.keys().scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject each(int want, PlObject List__) {' . chr(10) . ' return want == PlCx.LIST ? List__.each() : List__.each().aget(0);' . chr(10) . ' }' . chr(10) . ' public static final PlObject scalar(int want, PlArray List__) {' . chr(10) . ' if (List__.to_int() == 0) {' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' return List__.aget(-1).scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject join(int want, PlArray List__) {' . chr(10) . ' String s = List__.shift().toString();' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' boolean first = true;' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' String item = List__.aget(i).toString();' . chr(10) . ' if (first)' . chr(10) . ' first = false;' . chr(10) . ' else' . chr(10) . ' sb.append(s);' . chr(10) . ' sb.append(item);' . chr(10) . ' }' . chr(10) . ' return new PlString(sb.toString());' . chr(10) . ' }' . chr(10) . ' public static final PlObject reverse(int want, PlArray List__) {' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' PlArray ret = new PlArray(List__);' . chr(10) . ' Collections.reverse(ret.a);' . chr(10) . ' return ret;' . chr(10) . ' }' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' sb.append( List__.aget(i).toString() );' . chr(10) . ' }' . chr(10) . ' return new PlString(sb.reverse().toString());' . chr(10) . ' }' . chr(10) . ' public static final PlObject time(int want, PlArray List__) {' . chr(10) . ' return new PlDouble( System.currentTimeMillis() * 0.001 );' . chr(10) . ' }' . chr(10) . ' public static final PlObject sleep(int want, PlArray List__) {' . chr(10) . ' long s = (new Double(List__.shift().to_double() * 1000)).longValue();' . chr(10) . ' try {' . chr(10) . ' TimeUnit.MILLISECONDS.sleep(s);' . chr(10) . ' } catch (InterruptedException e) {' . chr(10) . ' //Handle exception' . chr(10) . ' }' . chr(10) . ' return new PlDouble(s / 1000.0);' . chr(10) . ' }' . chr(10) . ' public static final PlObject system(int want, PlArray List__) {' . chr(10) . ' // TODO - see perldoc -f system' . chr(10) . ' try {' . chr(10) . ' String[] args = new String[List__.to_int()];' . chr(10) . ' int i = 0;' . chr(10) . ' for (PlObject s : List__.a) {' . chr(10) . ' args[i++] = s.toString();' . chr(10) . ' }' . chr(10) . ' String s = null;' . chr(10) . ' Process p = Runtime.getRuntime().exec(args);' . chr(10) . ' // BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));' . chr(10) . ' // BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));' . chr(10) . ' // System.out.println("STDOUT' . chr(92) . 'n");' . chr(10) . ' // while ((s = stdInput.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' // }' . chr(10) . ' // System.out.println("STDERR' . chr(92) . 'n");' . chr(10) . ' // while ((s = stdError.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' // }' . chr(10) . ' return PlCx.INT0;' . chr(10) . ' }' . chr(10) . ' catch (IOException e) {' . chr(10) . ' // System.out.println("IOexception: ");' . chr(10) . ' // e.printStackTrace();' . chr(10) . ' return PlCx.MIN1;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject qx(int want, PlArray List__) {' . chr(10) . ' // TODO - see perldoc -f qx' . chr(10) . ' try {' . chr(10) . ' String[] args = new String[List__.to_int()];' . chr(10) . ' int i = 0;' . chr(10) . ' for (PlObject s : List__.a) {' . chr(10) . ' args[i++] = s.toString();' . chr(10) . ' }' . chr(10) . ' PlArray res = new PlArray();' . chr(10) . ' String s = null;' . chr(10) . ' Process p = Runtime.getRuntime().exec(args);' . chr(10) . ' BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));' . chr(10) . ' System.out.println("STDOUT' . chr(92) . 'n");' . chr(10) . ' while ((s = stdInput.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' res.push(s + "' . chr(92) . 'n");' . chr(10) . ' }' . chr(10) . ' // BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));' . chr(10) . ' // System.out.println("STDERR' . chr(92) . 'n");' . chr(10) . ' // while ((s = stdError.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' // }' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' return res;' . chr(10) . ' }' . chr(10) . ' res.unshift(PlCx.EMPTY);' . chr(10) . ' return join(want, res);' . chr(10) . ' }' . chr(10) . ' catch (IOException e) {' . chr(10) . ' // System.out.println("IOexception: ");' . chr(10) . ' // e.printStackTrace();' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PerlCompare implements Comparator {' . chr(10) . ' public PlClosure sorter;' . chr(10) . ' public PlLvalue v_a;' . chr(10) . ' public PlLvalue v_b;' . chr(10) . ' public PerlCompare (PlClosure sorter, PlLvalue a, PlLvalue b) {' . chr(10) . ' this.sorter = sorter;' . chr(10) . ' this.v_a = a;' . chr(10) . ' this.v_b = b;' . chr(10) . ' }' . chr(10) . ' public int compare (PlObject a, PlObject b) {' . chr(10) . ' v_a.set(a);' . chr(10) . ' v_b.set(b);' . chr(10) . ' return this.sorter.apply( PlCx.SCALAR, new PlArray() ).to_int();' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PerlOp {' . chr(10) . ' // PerlOp implements operators: && || ' . chr(10) . ' // and auxiliary functions' . chr(10) . ' //' . chr(10) . ' // note: ' . chr(39) . '+' . chr(39) . ' add() and ' . chr(39) . '-' . chr(39) . ' sub() are PlObject methods, not implemented here.' . chr(10) . ' //' . chr(10) . ' // TODO - see Perlito5/Javascript2/Runtime.pm for more operator implementations' . chr(10) . ' // TODO - ' . chr(39) . 'boolean_stack' . chr(39) . ' should be reset when an exception happens' . chr(10) . chr(10) . ' private static ArrayList boolean_stack = new ArrayList();' . chr(10) . ' private static PlArray local_stack = new PlArray();' . chr(10) . ' private static Random random = new Random();' . chr(10) . chr(10) . ' // local()' . chr(10) . ' public static final PlObject push_local(PlHash container, String index) {' . chr(10) . ' local_stack.a.add(container);' . chr(10) . ' local_stack.a.add(new PlString(index));' . chr(10) . ' PlLvalue empty = new PlLvalue();' . chr(10) . ' local_stack.a.add(container.hget_lvalue(index));' . chr(10) . ' container.h.put(index, empty);' . chr(10) . ' return empty;' . chr(10) . ' }' . chr(10) . ' public static final PlObject push_local(PlArray container, int index) {' . chr(10) . ' local_stack.a.add(container);' . chr(10) . ' local_stack.a.add(new PlInt(index));' . chr(10) . ' PlLvalue empty = new PlLvalue();' . chr(10) . ' local_stack.a.add(container.aget_lvalue(index));' . chr(10) . ' container.aset(index, empty);' . chr(10) . ' return empty;' . chr(10) . ' }' . chr(10) . ' public static final int local_length() {' . chr(10) . ' return local_stack.to_int();' . chr(10) . ' }' . chr(10) . ' public static final PlObject cleanup_local(int pos, PlObject ret) {' . chr(10) . ' while (local_stack.to_int() > pos) {' . chr(10) . ' PlLvalue lvalue = (PlLvalue)local_stack.pop();' . chr(10) . ' PlObject index = local_stack.pop();' . chr(10) . ' PlObject container = local_stack.pop();' . chr(10) . ' if (container.is_array()) {' . chr(10) . ' ((PlArray)container).a.set(index.to_int(), lvalue);' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' ((PlHash)container).h.put(index.toString(), lvalue);' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' return ret;' . chr(10) . ' }' . chr(10) . chr(10) . ' // context()' . chr(10) . ' // - handles run-time scalar/list/void context in expression results' . chr(10) . ' public static final PlObject context(int want, PlObject arg) {' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' return arg;' . chr(10) . ' }' . chr(10) . ' return arg.scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject context(int want) {' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' return new PlArray();' . chr(10) . ' }' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . chr(10) . ' // statement()' . chr(10) . ' // - workaround for "Error: not a statement"' . chr(10) . ' // - this is the compile-time version of context(null, arg)' . chr(10) . ' public static final void statement(PlObject arg) { }' . chr(10) . ' public static final void statement() { }' . chr(10) . chr(10) . ' // control-flow exceptions' . chr(10) . ' public static final PlObject next() {' . chr(10) . ' throw PlCx.NEXT;' . chr(10) . ' }' . chr(10) . ' public static final PlObject next(int label_id) {' . chr(10) . ' throw new PlNextException(label_id);' . chr(10) . ' }' . chr(10) . ' public static final PlObject last() {' . chr(10) . ' throw PlCx.LAST;' . chr(10) . ' }' . chr(10) . ' public static final PlObject last(int label_id) {' . chr(10) . ' throw new PlLastException(label_id);' . chr(10) . ' }' . chr(10) . ' public static final PlObject redo(int label_id) {' . chr(10) . ' throw new PlRedoException(label_id);' . chr(10) . ' }' . chr(10) . ' public static final PlObject ret(PlObject ret) {' . chr(10) . ' throw new PlReturnException(ret);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject caller(int ctx, PlObject s) {' . chr(10) . ' int item = s.to_int();' . chr(10) . ' PlCORE.die("caller() not implemented");' . chr(10) . ' return null;' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject srand() {' . chr(10) . ' random = new Random();' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' public static final PlObject srand(int s) {' . chr(10) . ' random = new Random(s);' . chr(10) . ' return new PlInt(s);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject rand(double s) {' . chr(10) . ' if (s == 0.0) {' . chr(10) . ' s = 1.0;' . chr(10) . ' }' . chr(10) . ' return new PlDouble(s * random.nextDouble());' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final int[] range(PlObject _start, PlObject _end, int ctx, String var, int ignore) {' . chr(10) . ' if (ctx == PlCx.LIST) {' . chr(10) . ' int start = _start.to_int(),' . chr(10) . ' end = _end.to_int();' . chr(10) . ' int size = Math.max(0, end - start + 1);' . chr(10) . ' int[] ret = new int[size];' . chr(10) . ' for (int i = 0; i < size; ++i) {' . chr(10) . ' ret[i] = start + i;' . chr(10) . ' }' . chr(10) . ' return ret;' . chr(10) . ' }' . chr(10) . ' PlCORE.die("Range not implemented for context " + ctx);' . chr(10) . ' return null;' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject smartmatch_scalar(PlObject arg0, PlObject arg1) {' . chr(10) . ' if (arg1.is_undef()) {' . chr(10) . ' return arg0.is_undef() ? PlCx.TRUE : PlCx.FALSE;' . chr(10) . ' }' . chr(10) . ' if (arg1.is_string()) {' . chr(10) . ' return arg0.str_eq(arg1);' . chr(10) . ' }' . chr(10) . ' if (arg1.is_num() || arg1.is_int()) {' . chr(10) . ' return arg0.num_eq(arg1);' . chr(10) . ' }' . chr(10) . ' return PlCORE.die(PlCx.VOID, new PlArray(new PlString("Not implemented: smartmatch operator with argument type ' . chr(39) . '"), PlCORE.ref(PlCx.SCALAR, new PlArray(arg1)), new PlString("' . chr(39) . '")));' . chr(10) . ' }' . chr(10) . chr(10) . ' // and1(x) ? y : and3()' . chr(10) . ' public static final boolean and1(PlObject arg1) {' . chr(10) . ' if (arg1.to_bool()) {' . chr(10) . ' return true;' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' boolean_stack.add(0, arg1);' . chr(10) . ' return false;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject and3() {' . chr(10) . ' return boolean_stack.remove(0);' . chr(10) . ' }' . chr(10) . chr(10) . ' // or1(x) ? or2() : y' . chr(10) . ' public static final boolean or1(PlObject arg1) {' . chr(10) . ' if (arg1.to_bool()) {' . chr(10) . ' boolean_stack.add(0, arg1);' . chr(10) . ' return true;' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' return false;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject or2() {' . chr(10) . ' return boolean_stack.remove(0);' . chr(10) . ' }' . chr(10) . chr(10) . ' // defined_or1(x) ? defined_or2() : y' . chr(10) . ' public static final boolean defined_or1(PlObject arg1) {' . chr(10) . ' if (!arg1.is_undef()) {' . chr(10) . ' boolean_stack.add(0, arg1);' . chr(10) . ' return true;' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' return false;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject defined_or2() {' . chr(10) . ' return boolean_stack.remove(0);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlInt ord(PlString s) {' . chr(10) . ' String item = s.toString();' . chr(10) . ' return new PlInt(item.length() > 0 ? Character.codePointAt(item, 0) : 0);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlString string_replicate(PlObject s, PlObject c) {' . chr(10) . ' int count = c.to_int();' . chr(10) . ' if ( count < 1 ) {' . chr(10) . ' return new PlString("");' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' String raw_s = s.toString();' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' for (int i = 0; i < count; i++) {' . chr(10) . ' sb.append(raw_s);' . chr(10) . ' }' . chr(10) . ' return new PlString(sb.toString());' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject list_replicate(PlArray o, PlObject c, int wantarray) {' . chr(10) . ' int count = c.to_int();' . chr(10) . ' PlArray a = new PlArray();' . chr(10) . ' if (count > 0) {' . chr(10) . ' for (int i = 0; i < count; i++) {' . chr(10) . ' a.push( o );' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' return (wantarray == PlCx.LIST ) ? a : a.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject grep(PlClosure c, PlArray a, int wantarray) {' . chr(10) . ' PlArray ret = new PlArray();' . chr(10) . ' int size = a.to_int();' . chr(10) . ' PlLvalue v__ref = (PlLvalue)PlV.get("main|v__");' . chr(10) . ' PlObject v__val = v__ref.get();' . chr(10) . ' for (int i = 0; i < size; i++) {' . chr(10) . ' boolean result;' . chr(10) . ' PlObject temp = a.aget(i);' . chr(10) . ' v__ref.set(temp);' . chr(10) . ' result = c.apply(PlCx.SCALAR, new PlArray()).to_bool();' . chr(10) . ' if (result) {' . chr(10) . ' ret.push(temp);' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' v__ref.set(v__val);' . chr(10) . ' return (wantarray == PlCx.LIST ) ? ret : ret.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject map(PlClosure c, PlArray a, int wantarray) {' . chr(10) . ' PlArray ret = new PlArray();' . chr(10) . ' int size = a.to_int();' . chr(10) . ' PlLvalue v__ref = (PlLvalue)PlV.get("main|v__");' . chr(10) . ' PlObject v__val = v__ref.get();' . chr(10) . ' for (int i = 0; i < size; i++) {' . chr(10) . ' v__ref.set(a.aget(i));' . chr(10) . ' ret.push(c.apply(PlCx.LIST, new PlArray()));' . chr(10) . ' }' . chr(10) . ' v__ref.set(v__val);' . chr(10) . ' return (wantarray == PlCx.LIST ) ? ret : ret.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject sort(PlClosure c, PlArray a, int wantarray, String pckg) {' . chr(10) . ' PlArray ret = new PlArray(a);' . chr(10) . ' int size = a.to_int();' . chr(10) . ' PlLvalue v_a_ref = (PlLvalue)PlV.get(pckg + "|v_a");' . chr(10) . ' PlLvalue v_b_ref = (PlLvalue)PlV.get(pckg + "|v_b");' . chr(10) . ' PerlCompare comp = new PerlCompare(c, v_a_ref, v_b_ref);' . chr(10) . ' PlObject v_a_val = v_a_ref.get();' . chr(10) . ' PlObject v_b_val = v_b_ref.get();' . chr(10) . ' Collections.sort(ret.a, comp);' . chr(10) . ' v_a_ref.set(v_a_val);' . chr(10) . ' v_b_ref.set(v_b_val);' . chr(10) . ' return (wantarray == PlCx.LIST ) ? ret : ret.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject match(PlObject s, PlRegex pat, int want) {' . chr(10) . ' if (want != PlCx.LIST) {' . chr(10) . ' return pat.p.matcher(s.toString()).find() ? PlCx.TRUE : PlCx.FALSE;' . chr(10) . ' }' . chr(10) . ' PlCORE.die("not implemented string match in list context");' . chr(10) . ' return s;' . chr(10) . ' }' . chr(10) . ' public static final PlObject match(PlObject s, PlLvalue pat, int want) {' . chr(10) . ' return match(s, pat.get(), want);' . chr(10) . ' }' . chr(10) . ' public static final PlObject match(PlObject s, PlObject pat, int want) {' . chr(10) . ' // TODO - cache the compiled pattern' . chr(10) . ' return match(s, new PlRegex(pat, 0), want);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject replace(PlLvalue s, PlRegex pat, PlObject rep, int want) {' . chr(10) . ' if (want != PlCx.LIST) {' . chr(10) . ' return s.set(new PlString(pat.p.matcher(s.toString()).replaceAll(rep.toString())));' . chr(10) . ' }' . chr(10) . ' PlCORE.die("not implemented string replace in list context");' . chr(10) . ' return s;' . chr(10) . ' }' . chr(10) . ' public static final PlObject replace(PlObject s, PlObject pat, PlObject rep, int want) {' . chr(10) . ' // TODO - cache the compiled pattern' . chr(10) . ' return replace(s, new PlRegex(pat, 0), rep, want);' . chr(10) . ' }' . chr(10) . chr(10) . '}' . chr(10) . 'class PlV {' . chr(10) . ' // PlV implements namespaces and global variables' . chr(10) . ' //' . chr(10) . ' // TODO - import CORE subroutines in new namespaces, if needed' . chr(10) . ' // TODO - cache lookups in lexical variables (see PlClosure implementation)' . chr(10) . chr(10) . ' public static final PlHash var = new PlHash();' . chr(10) . chr(10) . ' public static final PlLvalue get(String name) {' . chr(10) . ' return (PlLvalue)var.hget_lvalue(name);' . chr(10) . ' }' . chr(10) . ' public static final PlLvalue get_local(String name) {' . chr(10) . ' return (PlLvalue)var.hget_lvalue_local(name);' . chr(10) . ' }' . chr(10) . ' public static final PlObject set(String name, PlObject v) {' . chr(10) . ' return var.hset(name, v);' . chr(10) . ' }' . chr(10) . ' public static final PlObject set_local(String name, PlObject v) {' . chr(10) . ' return var.hget_lvalue_local(name).set(v);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlHash hash_get(String name) {' . chr(10) . ' return (PlHash)var.hget_hashref(name).get();' . chr(10) . ' }' . chr(10) . ' public static final PlHash hash_get_local(String name) {' . chr(10) . ' return (PlHash)var.hget_lvalue_local(name).get_hashref().get();' . chr(10) . ' }' . chr(10) . ' public static final PlObject hash_set(String name, PlObject v) {' . chr(10) . ' return var.hget_hashref(name).hash_deref_set(v);' . chr(10) . ' }' . chr(10) . ' public static final PlObject hash_set_local(String name, PlObject v) {' . chr(10) . ' return var.hget_lvalue_local(name).get_hashref().hash_deref_set(v);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlArray array_get(String name) {' . chr(10) . ' return (PlArray)var.hget_arrayref(name).get();' . chr(10) . ' }' . chr(10) . ' public static final PlArray array_get_local(String name) {' . chr(10) . ' return (PlArray)var.hget_lvalue_local(name).get_arrayref().get();' . chr(10) . ' }' . chr(10) . ' public static final PlObject array_set(String name, PlObject v) {' . chr(10) . ' return var.hget_arrayref(name).array_deref_set(v);' . chr(10) . ' }' . chr(10) . ' public static final PlObject array_set_local(String name, PlObject v) {' . chr(10) . ' return var.hget_lvalue_local(name).get_arrayref().array_deref_set(v);' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlEnv {' . chr(10) . ' public static final void init(String[] args) {' . chr(10) . ' PlV.array_set(PlCx.ARGV, new PlArray(args)); // args is String[]' . chr(10) . ' PlV.hash_set(PlCx.ENV, new PlArray(System.getenv())); // env is Map' . chr(10) . ' PlV.set("main|v_" + (char)34, new PlString(" ")); // $" = " "' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlObject {' . chr(10) . ' // extends java object ???' . chr(10) . ' public static final PlString REF = new PlString("");' . chr(10) . chr(10) . ' public PlObject() {' . chr(10) . ' }' . chr(10) . join('', (map { + } (-2 .. 2)) . chr(10) . ' ' . join(chr(10) . ' ', @{$args{'java_constants'} // []}) . chr(10) . '}' . chr(10) . 'class PlCORE {' . chr(10) . ' public static final PlObject print(int want, PlObject filehandle, PlArray List__) {' . chr(10) . ' // TODO - write to filehandle' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' System.out.print(List__.aget(i).toString());' . chr(10) . ' }' . chr(10) . ' return PlCx.INT1;' . chr(10) . ' }' . chr(10) . ' public static final PlObject say(int want, PlObject filehandle, PlArray List__) {' . chr(10) . ' // TODO - write to filehandle' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' System.out.print(List__.aget(i).toString());' . chr(10) . ' }' . chr(10) . ' System.out.println("");' . chr(10) . ' return PlCx.INT1;' . chr(10) . ' }' . chr(10) . ' public static final PlObject say(String s) {' . chr(10) . ' // say() shortcut' . chr(10) . ' return PlCORE.say(PlCx.VOID, PlCx.STDOUT, new PlArray(new PlString(s)));' . chr(10) . ' }' . chr(10) . ' public static final PlObject exit(int want, PlArray List__) {' . chr(10) . ' int arg = List__.aget(0).to_int();' . chr(10) . ' System.exit(arg);' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' public static final PlObject warn(int want, PlArray List__) {' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' System.err.print(List__.aget(i).toString());' . chr(10) . ' }' . chr(10) . ' System.err.println("");' . chr(10) . ' return PlCx.INT1;' . chr(10) . ' }' . chr(10) . ' public static final PlObject die(int want, PlArray List__) {' . chr(10) . ' PlObject arg = List__.aget(0);' . chr(10) . ' if (arg.is_undef() || (arg.is_string() && arg.toString() == "")) {' . chr(10) . ' throw new PlDieException(PlCx.DIED);' . chr(10) . ' }' . chr(10) . ' if (List__.to_int() == 1) {' . chr(10) . ' throw new PlDieException(arg);' . chr(10) . ' }' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' String item = List__.aget(i).toString();' . chr(10) . ' sb.append(item);' . chr(10) . ' }' . chr(10) . ' throw new PlDieException(new PlString(sb.toString()));' . chr(10) . ' }' . chr(10) . ' public static final PlObject die(String s) {' . chr(10) . ' // die() shortcut' . chr(10) . ' return PlCORE.die(PlCx.VOID, new PlArray(new PlString(s)));' . chr(10) . ' }' . chr(10) . ' public static final PlObject ref(int want, PlArray List__) {' . chr(10) . ' return List__.aget(0).ref();' . chr(10) . ' }' . chr(10) . ' public static final PlObject values(int want, PlObject List__) {' . chr(10) . ' return want == PlCx.LIST ? List__.values() : List__.values().scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject keys(int want, PlObject List__) {' . chr(10) . ' return want == PlCx.LIST ? List__.keys() : List__.keys().scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject each(int want, PlObject List__) {' . chr(10) . ' return want == PlCx.LIST ? List__.each() : List__.each().aget(0);' . chr(10) . ' }' . chr(10) . ' public static final PlObject scalar(int want, PlArray List__) {' . chr(10) . ' if (List__.to_int() == 0) {' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' return List__.aget(-1).scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject join(int want, PlArray List__) {' . chr(10) . ' String s = List__.shift().toString();' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' boolean first = true;' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' String item = List__.aget(i).toString();' . chr(10) . ' if (first)' . chr(10) . ' first = false;' . chr(10) . ' else' . chr(10) . ' sb.append(s);' . chr(10) . ' sb.append(item);' . chr(10) . ' }' . chr(10) . ' return new PlString(sb.toString());' . chr(10) . ' }' . chr(10) . ' public static final PlObject reverse(int want, PlArray List__) {' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' PlArray ret = new PlArray(List__);' . chr(10) . ' Collections.reverse(ret.a);' . chr(10) . ' return ret;' . chr(10) . ' }' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' for (int i = 0; i < List__.to_int(); i++) {' . chr(10) . ' sb.append( List__.aget(i).toString() );' . chr(10) . ' }' . chr(10) . ' return new PlString(sb.reverse().toString());' . chr(10) . ' }' . chr(10) . ' public static final PlObject time(int want, PlArray List__) {' . chr(10) . ' return new PlDouble( System.currentTimeMillis() * 0.001 );' . chr(10) . ' }' . chr(10) . ' public static final PlObject sleep(int want, PlArray List__) {' . chr(10) . ' long s = (new Double(List__.shift().to_double() * 1000)).longValue();' . chr(10) . ' try {' . chr(10) . ' TimeUnit.MILLISECONDS.sleep(s);' . chr(10) . ' } catch (InterruptedException e) {' . chr(10) . ' //Handle exception' . chr(10) . ' }' . chr(10) . ' return new PlDouble(s / 1000.0);' . chr(10) . ' }' . chr(10) . ' public static final PlObject system(int want, PlArray List__) {' . chr(10) . ' // TODO - see perldoc -f system' . chr(10) . ' try {' . chr(10) . ' String[] args = new String[List__.to_int()];' . chr(10) . ' int i = 0;' . chr(10) . ' for (PlObject s : List__.a) {' . chr(10) . ' args[i++] = s.toString();' . chr(10) . ' }' . chr(10) . ' String s = null;' . chr(10) . ' Process p = Runtime.getRuntime().exec(args);' . chr(10) . ' // BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));' . chr(10) . ' // BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));' . chr(10) . ' // System.out.println("STDOUT' . chr(92) . 'n");' . chr(10) . ' // while ((s = stdInput.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' // }' . chr(10) . ' // System.out.println("STDERR' . chr(92) . 'n");' . chr(10) . ' // while ((s = stdError.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' // }' . chr(10) . ' return PlCx.INT0;' . chr(10) . ' }' . chr(10) . ' catch (IOException e) {' . chr(10) . ' // System.out.println("IOexception: ");' . chr(10) . ' // e.printStackTrace();' . chr(10) . ' return PlCx.MIN1;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject qx(int want, PlArray List__) {' . chr(10) . ' // TODO - see perldoc -f qx' . chr(10) . ' try {' . chr(10) . ' String[] args = new String[List__.to_int()];' . chr(10) . ' int i = 0;' . chr(10) . ' for (PlObject s : List__.a) {' . chr(10) . ' args[i++] = s.toString();' . chr(10) . ' }' . chr(10) . ' PlArray res = new PlArray();' . chr(10) . ' String s = null;' . chr(10) . ' Process p = Runtime.getRuntime().exec(args);' . chr(10) . ' BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));' . chr(10) . ' System.out.println("STDOUT' . chr(92) . 'n");' . chr(10) . ' while ((s = stdInput.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' res.push(s + "' . chr(92) . 'n");' . chr(10) . ' }' . chr(10) . ' // BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));' . chr(10) . ' // System.out.println("STDERR' . chr(92) . 'n");' . chr(10) . ' // while ((s = stdError.readLine()) != null) {' . chr(10) . ' // System.out.println(" " + s);' . chr(10) . ' // }' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' return res;' . chr(10) . ' }' . chr(10) . ' res.unshift(PlCx.EMPTY);' . chr(10) . ' return join(want, res);' . chr(10) . ' }' . chr(10) . ' catch (IOException e) {' . chr(10) . ' // System.out.println("IOexception: ");' . chr(10) . ' // e.printStackTrace();' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PerlCompare implements Comparator {' . chr(10) . ' public PlClosure sorter;' . chr(10) . ' public PlLvalue v_a;' . chr(10) . ' public PlLvalue v_b;' . chr(10) . ' public PerlCompare (PlClosure sorter, PlLvalue a, PlLvalue b) {' . chr(10) . ' this.sorter = sorter;' . chr(10) . ' this.v_a = a;' . chr(10) . ' this.v_b = b;' . chr(10) . ' }' . chr(10) . ' public int compare (PlObject a, PlObject b) {' . chr(10) . ' v_a.set(a);' . chr(10) . ' v_b.set(b);' . chr(10) . ' return this.sorter.apply( PlCx.SCALAR, new PlArray() ).to_int();' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PerlOp {' . chr(10) . ' // PerlOp implements operators: && || ' . chr(10) . ' // and auxiliary functions' . chr(10) . ' //' . chr(10) . ' // note: ' . chr(39) . '+' . chr(39) . ' add() and ' . chr(39) . '-' . chr(39) . ' sub() are PlObject methods, not implemented here.' . chr(10) . ' //' . chr(10) . ' // TODO - see Perlito5/Javascript2/Runtime.pm for more operator implementations' . chr(10) . ' // TODO - ' . chr(39) . 'boolean_stack' . chr(39) . ' should be reset when an exception happens' . chr(10) . chr(10) . ' private static ArrayList boolean_stack = new ArrayList();' . chr(10) . ' private static PlArray local_stack = new PlArray();' . chr(10) . ' private static Random random = new Random();' . chr(10) . chr(10) . ' // local()' . chr(10) . ' public static final PlObject push_local(PlHash container, String index) {' . chr(10) . ' local_stack.a.add(container);' . chr(10) . ' local_stack.a.add(new PlString(index));' . chr(10) . ' PlLvalue empty = new PlLvalue();' . chr(10) . ' local_stack.a.add(container.hget_lvalue(index));' . chr(10) . ' container.h.put(index, empty);' . chr(10) . ' return empty;' . chr(10) . ' }' . chr(10) . ' public static final PlObject push_local(PlArray container, int index) {' . chr(10) . ' local_stack.a.add(container);' . chr(10) . ' local_stack.a.add(new PlInt(index));' . chr(10) . ' PlLvalue empty = new PlLvalue();' . chr(10) . ' local_stack.a.add(container.aget_lvalue(index));' . chr(10) . ' container.aset(index, empty);' . chr(10) . ' return empty;' . chr(10) . ' }' . chr(10) . ' public static final int local_length() {' . chr(10) . ' return local_stack.to_int();' . chr(10) . ' }' . chr(10) . ' public static final PlObject cleanup_local(int pos, PlObject ret) {' . chr(10) . ' while (local_stack.to_int() > pos) {' . chr(10) . ' PlLvalue lvalue = (PlLvalue)local_stack.pop();' . chr(10) . ' PlObject index = local_stack.pop();' . chr(10) . ' PlObject container = local_stack.pop();' . chr(10) . ' if (container.is_array()) {' . chr(10) . ' ((PlArray)container).a.set(index.to_int(), lvalue);' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' ((PlHash)container).h.put(index.toString(), lvalue);' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' return ret;' . chr(10) . ' }' . chr(10) . chr(10) . ' // context()' . chr(10) . ' // - handles run-time scalar/list/void context in expression results' . chr(10) . ' public static final PlObject context(int want, PlObject arg) {' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' return arg;' . chr(10) . ' }' . chr(10) . ' return arg.scalar();' . chr(10) . ' }' . chr(10) . ' public static final PlObject context(int want) {' . chr(10) . ' if (want == PlCx.LIST) {' . chr(10) . ' return new PlArray();' . chr(10) . ' }' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . chr(10) . ' // statement()' . chr(10) . ' // - workaround for "Error: not a statement"' . chr(10) . ' // - this is the compile-time version of context(null, arg)' . chr(10) . ' public static final void statement(PlObject arg) { }' . chr(10) . ' public static final void statement() { }' . chr(10) . chr(10) . ' // control-flow exceptions' . chr(10) . ' public static final PlObject next() {' . chr(10) . ' throw PlCx.NEXT;' . chr(10) . ' }' . chr(10) . ' public static final PlObject next(int label_id) {' . chr(10) . ' throw new PlNextException(label_id);' . chr(10) . ' }' . chr(10) . ' public static final PlObject last() {' . chr(10) . ' throw PlCx.LAST;' . chr(10) . ' }' . chr(10) . ' public static final PlObject last(int label_id) {' . chr(10) . ' throw new PlLastException(label_id);' . chr(10) . ' }' . chr(10) . ' public static final PlObject redo(int label_id) {' . chr(10) . ' throw new PlRedoException(label_id);' . chr(10) . ' }' . chr(10) . ' public static final PlObject ret(PlObject ret) {' . chr(10) . ' throw new PlReturnException(ret);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject caller(int ctx, PlObject s) {' . chr(10) . ' int item = s.to_int();' . chr(10) . ' PlCORE.die("caller() not implemented");' . chr(10) . ' return null;' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject srand() {' . chr(10) . ' random = new Random();' . chr(10) . ' return PlCx.UNDEF;' . chr(10) . ' }' . chr(10) . ' public static final PlObject srand(int s) {' . chr(10) . ' random = new Random(s);' . chr(10) . ' return new PlInt(s);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject rand(double s) {' . chr(10) . ' if (s == 0.0) {' . chr(10) . ' s = 1.0;' . chr(10) . ' }' . chr(10) . ' return new PlDouble(s * random.nextDouble());' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final int[] range(PlObject _start, PlObject _end, int ctx, String var, int ignore) {' . chr(10) . ' if (ctx == PlCx.LIST) {' . chr(10) . ' int start = _start.to_int(),' . chr(10) . ' end = _end.to_int();' . chr(10) . ' int size = Math.max(0, end - start + 1);' . chr(10) . ' int[] ret = new int[size];' . chr(10) . ' for (int i = 0; i < size; ++i) {' . chr(10) . ' ret[i] = start + i;' . chr(10) . ' }' . chr(10) . ' return ret;' . chr(10) . ' }' . chr(10) . ' PlCORE.die("Range not implemented for context " + ctx);' . chr(10) . ' return null;' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject smartmatch_scalar(PlObject arg0, PlObject arg1) {' . chr(10) . ' if (arg1.is_undef()) {' . chr(10) . ' return arg0.is_undef() ? PlCx.TRUE : PlCx.FALSE;' . chr(10) . ' }' . chr(10) . ' if (arg1.is_string()) {' . chr(10) . ' return arg0.str_eq(arg1);' . chr(10) . ' }' . chr(10) . ' if (arg1.is_num() || arg1.is_int()) {' . chr(10) . ' return arg0.num_eq(arg1);' . chr(10) . ' }' . chr(10) . ' return PlCORE.die(PlCx.VOID, new PlArray(new PlString("Not implemented: smartmatch operator with argument type ' . chr(39) . '"), PlCORE.ref(PlCx.SCALAR, new PlArray(arg1)), new PlString("' . chr(39) . '")));' . chr(10) . ' }' . chr(10) . chr(10) . ' // and1(x) ? y : and3()' . chr(10) . ' public static final boolean and1(PlObject arg1) {' . chr(10) . ' if (arg1.to_bool()) {' . chr(10) . ' return true;' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' boolean_stack.add(0, arg1);' . chr(10) . ' return false;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject and3() {' . chr(10) . ' return boolean_stack.remove(0);' . chr(10) . ' }' . chr(10) . chr(10) . ' // or1(x) ? or2() : y' . chr(10) . ' public static final boolean or1(PlObject arg1) {' . chr(10) . ' if (arg1.to_bool()) {' . chr(10) . ' boolean_stack.add(0, arg1);' . chr(10) . ' return true;' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' return false;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject or2() {' . chr(10) . ' return boolean_stack.remove(0);' . chr(10) . ' }' . chr(10) . chr(10) . ' // defined_or1(x) ? defined_or2() : y' . chr(10) . ' public static final boolean defined_or1(PlObject arg1) {' . chr(10) . ' if (!arg1.is_undef()) {' . chr(10) . ' boolean_stack.add(0, arg1);' . chr(10) . ' return true;' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' return false;' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject defined_or2() {' . chr(10) . ' return boolean_stack.remove(0);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlInt ord(PlString s) {' . chr(10) . ' String item = s.toString();' . chr(10) . ' return new PlInt(item.length() > 0 ? Character.codePointAt(item, 0) : 0);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlString string_replicate(PlObject s, PlObject c) {' . chr(10) . ' int count = c.to_int();' . chr(10) . ' if ( count < 1 ) {' . chr(10) . ' return new PlString("");' . chr(10) . ' }' . chr(10) . ' else {' . chr(10) . ' String raw_s = s.toString();' . chr(10) . ' StringBuilder sb = new StringBuilder();' . chr(10) . ' for (int i = 0; i < count; i++) {' . chr(10) . ' sb.append(raw_s);' . chr(10) . ' }' . chr(10) . ' return new PlString(sb.toString());' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' public static final PlObject list_replicate(PlArray o, PlObject c, int wantarray) {' . chr(10) . ' int count = c.to_int();' . chr(10) . ' PlArray a = new PlArray();' . chr(10) . ' if (count > 0) {' . chr(10) . ' for (int i = 0; i < count; i++) {' . chr(10) . ' a.push( o );' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' return (wantarray == PlCx.LIST ) ? a : a.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject grep(PlClosure c, PlArray a, int wantarray) {' . chr(10) . ' PlArray ret = new PlArray();' . chr(10) . ' int size = a.to_int();' . chr(10) . ' PlLvalue v__ref = (PlLvalue)PlV.get("main|v__");' . chr(10) . ' PlObject v__val = v__ref.get();' . chr(10) . ' for (int i = 0; i < size; i++) {' . chr(10) . ' boolean result;' . chr(10) . ' PlObject temp = a.aget(i);' . chr(10) . ' v__ref.set(temp);' . chr(10) . ' result = c.apply(PlCx.SCALAR, new PlArray()).to_bool();' . chr(10) . ' if (result) {' . chr(10) . ' ret.push(temp);' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' v__ref.set(v__val);' . chr(10) . ' return (wantarray == PlCx.LIST ) ? ret : ret.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject map(PlClosure c, PlArray a, int wantarray) {' . chr(10) . ' PlArray ret = new PlArray();' . chr(10) . ' int size = a.to_int();' . chr(10) . ' PlLvalue v__ref = (PlLvalue)PlV.get("main|v__");' . chr(10) . ' PlObject v__val = v__ref.get();' . chr(10) . ' for (int i = 0; i < size; i++) {' . chr(10) . ' v__ref.set(a.aget(i));' . chr(10) . ' ret.push(c.apply(PlCx.LIST, new PlArray()));' . chr(10) . ' }' . chr(10) . ' v__ref.set(v__val);' . chr(10) . ' return (wantarray == PlCx.LIST ) ? ret : ret.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject sort(PlClosure c, PlArray a, int wantarray, String pckg) {' . chr(10) . ' PlArray ret = new PlArray(a);' . chr(10) . ' int size = a.to_int();' . chr(10) . ' PlLvalue v_a_ref = (PlLvalue)PlV.get(pckg + "|v_a");' . chr(10) . ' PlLvalue v_b_ref = (PlLvalue)PlV.get(pckg + "|v_b");' . chr(10) . ' PerlCompare comp = new PerlCompare(c, v_a_ref, v_b_ref);' . chr(10) . ' PlObject v_a_val = v_a_ref.get();' . chr(10) . ' PlObject v_b_val = v_b_ref.get();' . chr(10) . ' Collections.sort(ret.a, comp);' . chr(10) . ' v_a_ref.set(v_a_val);' . chr(10) . ' v_b_ref.set(v_b_val);' . chr(10) . ' return (wantarray == PlCx.LIST ) ? ret : ret.length_of_array();' . chr(10) . ' }' . chr(10) . ' public static final PlObject match(PlObject s, PlRegex pat, int want) {' . chr(10) . ' if (want != PlCx.LIST) {' . chr(10) . ' return pat.p.matcher(s.toString()).find() ? PlCx.TRUE : PlCx.FALSE;' . chr(10) . ' }' . chr(10) . ' PlArray ret = new PlArray();' . chr(10) . ' Matcher matcher = pat.p.matcher(s.toString());' . chr(10) . ' while (matcher.find()) {' . chr(10) . ' for (int i = 0; i <= matcher.groupCount(); i++) {' . chr(10) . ' ret.push(matcher.group(i));' . chr(10) . ' }' . chr(10) . ' }' . chr(10) . ' return ret;' . chr(10) . ' }' . chr(10) . ' public static final PlObject match(PlObject s, PlLvalue pat, int want) {' . chr(10) . ' return match(s, pat.get(), want);' . chr(10) . ' }' . chr(10) . ' public static final PlObject match(PlObject s, PlObject pat, int want) {' . chr(10) . ' // TODO - cache the compiled pattern' . chr(10) . ' return match(s, new PlRegex(pat, 0), want);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlObject replace(PlLvalue s, PlRegex pat, PlObject rep, int want) {' . chr(10) . ' if (want != PlCx.LIST) {' . chr(10) . ' return s.set(new PlString(pat.p.matcher(s.toString()).replaceAll(rep.toString())));' . chr(10) . ' }' . chr(10) . ' PlCORE.die("not implemented string replace in list context");' . chr(10) . ' return s;' . chr(10) . ' }' . chr(10) . ' public static final PlObject replace(PlObject s, PlObject pat, PlObject rep, int want) {' . chr(10) . ' // TODO - cache the compiled pattern' . chr(10) . ' return replace(s, new PlRegex(pat, 0), rep, want);' . chr(10) . ' }' . chr(10) . chr(10) . '}' . chr(10) . 'class PlV {' . chr(10) . ' // PlV implements namespaces and global variables' . chr(10) . ' //' . chr(10) . ' // TODO - import CORE subroutines in new namespaces, if needed' . chr(10) . ' // TODO - cache lookups in lexical variables (see PlClosure implementation)' . chr(10) . chr(10) . ' public static final PlHash var = new PlHash();' . chr(10) . chr(10) . ' public static final PlLvalue get(String name) {' . chr(10) . ' return (PlLvalue)var.hget_lvalue(name);' . chr(10) . ' }' . chr(10) . ' public static final PlLvalue get_local(String name) {' . chr(10) . ' return (PlLvalue)var.hget_lvalue_local(name);' . chr(10) . ' }' . chr(10) . ' public static final PlObject set(String name, PlObject v) {' . chr(10) . ' return var.hset(name, v);' . chr(10) . ' }' . chr(10) . ' public static final PlObject set_local(String name, PlObject v) {' . chr(10) . ' return var.hget_lvalue_local(name).set(v);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlHash hash_get(String name) {' . chr(10) . ' return (PlHash)var.hget_hashref(name).get();' . chr(10) . ' }' . chr(10) . ' public static final PlHash hash_get_local(String name) {' . chr(10) . ' return (PlHash)var.hget_lvalue_local(name).get_hashref().get();' . chr(10) . ' }' . chr(10) . ' public static final PlObject hash_set(String name, PlObject v) {' . chr(10) . ' return var.hget_hashref(name).hash_deref_set(v);' . chr(10) . ' }' . chr(10) . ' public static final PlObject hash_set_local(String name, PlObject v) {' . chr(10) . ' return var.hget_lvalue_local(name).get_hashref().hash_deref_set(v);' . chr(10) . ' }' . chr(10) . chr(10) . ' public static final PlArray array_get(String name) {' . chr(10) . ' return (PlArray)var.hget_arrayref(name).get();' . chr(10) . ' }' . chr(10) . ' public static final PlArray array_get_local(String name) {' . chr(10) . ' return (PlArray)var.hget_lvalue_local(name).get_arrayref().get();' . chr(10) . ' }' . chr(10) . ' public static final PlObject array_set(String name, PlObject v) {' . chr(10) . ' return var.hget_arrayref(name).array_deref_set(v);' . chr(10) . ' }' . chr(10) . ' public static final PlObject array_set_local(String name, PlObject v) {' . chr(10) . ' return var.hget_lvalue_local(name).get_arrayref().array_deref_set(v);' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlEnv {' . chr(10) . ' public static final void init(String[] args) {' . chr(10) . ' PlV.array_set(PlCx.ARGV, new PlArray(args)); // args is String[]' . chr(10) . ' PlV.hash_set(PlCx.ENV, new PlArray(System.getenv())); // env is Map' . chr(10) . ' PlV.set("main|v_" + (char)34, new PlString(" ")); // $" = " "' . chr(10) . ' }' . chr(10) . '}' . chr(10) . 'class PlObject {' . chr(10) . ' // extends java object ???' . chr(10) . ' public static final PlString REF = new PlString("");' . chr(10) . chr(10) . ' public PlObject() {' . chr(10) . ' }' . chr(10) . join('', (map { my $class = $_; my $java_class_name = $class->{'java_type'}; my $perl_to_java = $class->{'perl_to_java'}; diff --git a/src5/lib/Perlito5/Java/Runtime.pm b/src5/lib/Perlito5/Java/Runtime.pm index addb63f87..d0d39a496 100644 --- a/src5/lib/Perlito5/Java/Runtime.pm +++ b/src5/lib/Perlito5/Java/Runtime.pm @@ -566,8 +566,14 @@ class PerlOp { if (want != PlCx.LIST) { return pat.p.matcher(s.toString()).find() ? PlCx.TRUE : PlCx.FALSE; } - PlCORE.die("not implemented string match in list context"); - return s; + PlArray ret = new PlArray(); + Matcher matcher = pat.p.matcher(s.toString()); + while (matcher.find()) { + for (int i = 0; i <= matcher.groupCount(); i++) { + ret.push(matcher.group(i)); + } + } + return ret; } public static final PlObject match(PlObject s, PlLvalue pat, int want) { return match(s, pat.get(), want);