Добавлена функция foreach

This commit is contained in:
Victor 2016-01-08 21:32:57 +02:00
parent 4004703cb6
commit b6d3c30ee4
5 changed files with 57 additions and 16 deletions

View File

@ -88,3 +88,5 @@ map = {"+" : add, "-" : sub. "*" : mul, "/" : div}
//print map["+"] //print map["+"]
print "\n" print "\n"
print function(map["+"], 4, 5) print function(map["+"], 4, 5)
print "\n"
foreach(map, def(op, func) = echo (4, op, 5, "=", func(4,5)))

View File

@ -1,12 +1,13 @@
package com.annimon.ownlang.lib; package com.annimon.ownlang.lib;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator;
/** /**
* *
* @author aNNiMON * @author aNNiMON
*/ */
public final class ArrayValue implements Value { public final class ArrayValue implements Value, Iterable<Value> {
private final Value[] elements; private final Value[] elements;
@ -41,6 +42,11 @@ public final class ArrayValue implements Value {
return Arrays.toString(elements); return Arrays.toString(elements);
} }
@Override
public Iterator<Value> iterator() {
return Arrays.asList(elements).iterator();
}
@Override @Override
public int hashCode() { public int hashCode() {
int hash = 5; int hash = 5;
@ -58,8 +64,6 @@ public final class ArrayValue implements Value {
return Arrays.deepEquals(this.elements, other.elements); return Arrays.deepEquals(this.elements, other.elements);
} }
@Override @Override
public String toString() { public String toString() {
return asString(); return asString();

View File

@ -1,6 +1,7 @@
package com.annimon.ownlang.lib; package com.annimon.ownlang.lib;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -8,7 +9,7 @@ import java.util.Objects;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public final class MapValue implements Value { public class MapValue implements Value, Iterable<Map.Entry<Value, Value>> {
private final Map<Value, Value> map; private final Map<Value, Value> map;
@ -16,6 +17,10 @@ public final class MapValue implements Value {
this.map = new HashMap<>(size); this.map = new HashMap<>(size);
} }
public MapValue(Map<Value, Value> map) {
this.map = map;
}
public Value get(Value key) { public Value get(Value key) {
return map.get(key); return map.get(key);
} }
@ -34,6 +39,11 @@ public final class MapValue implements Value {
return map.toString(); return map.toString();
} }
@Override
public Iterator<Map.Entry<Value, Value>> iterator() {
return map.entrySet().iterator();
}
@Override @Override
public int hashCode() { public int hashCode() {
int hash = 5; int hash = 5;
@ -51,8 +61,6 @@ public final class MapValue implements Value {
return Objects.equals(this.map, other.map); return Objects.equals(this.map, other.map);
} }
@Override @Override
public String toString() { public String toString() {
return asString(); return asString();

View File

@ -0,0 +1,32 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.*;
import java.util.Map;
public final class std_foreach implements Function {
@Override
public Value execute(Value... args) {
if (args.length != 2) return NumberValue.ZERO;
if (!(args[1] instanceof FunctionValue)) return NumberValue.ZERO;
final Function function = ((FunctionValue) args[1]).getValue();
final Value container = args[0];
if (container instanceof ArrayValue) {
final ArrayValue array = (ArrayValue) container;
for (Value element : array) {
function.execute(element);
}
return NumberValue.ZERO;
}
if (container instanceof MapValue) {
final MapValue map = (MapValue) container;
for (Map.Entry<Value, Value> element : map) {
function.execute(element.getKey(), element.getValue());
}
return NumberValue.ZERO;
}
return NumberValue.ZERO;
}
}

View File

@ -1,13 +1,7 @@
package com.annimon.ownlang.lib.modules; package com.annimon.ownlang.lib.modules;
import com.annimon.ownlang.lib.*; import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.modules.functions.std_echo; import com.annimon.ownlang.lib.modules.functions.*;
import com.annimon.ownlang.lib.modules.functions.std_foreach;
import com.annimon.ownlang.lib.modules.functions.std_newarray;
import com.annimon.ownlang.lib.modules.functions.std_rand;
import com.annimon.ownlang.lib.modules.functions.std_sleep;
import com.annimon.ownlang.lib.modules.functions.std_thread;
import java.util.Random;
/** /**
* *
@ -18,6 +12,7 @@ public final class std implements Module {
@Override @Override
public void init() { public void init() {
Functions.set("echo", new std_echo()); Functions.set("echo", new std_echo());
Functions.set("foreach", new std_foreach());
Functions.set("newarray", new std_newarray()); Functions.set("newarray", new std_newarray());
Functions.set("rand", new std_rand()); Functions.set("rand", new std_rand());
Functions.set("sleep", new std_sleep()); Functions.set("sleep", new std_sleep());