diff --git a/program.own b/program.own index 25141c6..b861f63 100644 --- a/program.own +++ b/program.own @@ -87,4 +87,6 @@ for i = 0, i < 4, i = i + 1 { map = {"+" : add, "-" : sub. "*" : mul, "/" : div} //print map["+"] print "\n" -print function(map["+"], 4, 5) \ No newline at end of file +print function(map["+"], 4, 5) +print "\n" +foreach(map, def(op, func) = echo (4, op, 5, "=", func(4,5))) diff --git a/src/com/annimon/ownlang/lib/ArrayValue.java b/src/com/annimon/ownlang/lib/ArrayValue.java index fbee729..9a570df 100644 --- a/src/com/annimon/ownlang/lib/ArrayValue.java +++ b/src/com/annimon/ownlang/lib/ArrayValue.java @@ -1,12 +1,13 @@ package com.annimon.ownlang.lib; import java.util.Arrays; +import java.util.Iterator; /** * * @author aNNiMON */ -public final class ArrayValue implements Value { +public final class ArrayValue implements Value, Iterable { private final Value[] elements; @@ -41,6 +42,11 @@ public final class ArrayValue implements Value { return Arrays.toString(elements); } + @Override + public Iterator iterator() { + return Arrays.asList(elements).iterator(); + } + @Override public int hashCode() { int hash = 5; @@ -57,8 +63,6 @@ public final class ArrayValue implements Value { final ArrayValue other = (ArrayValue) obj; return Arrays.deepEquals(this.elements, other.elements); } - - @Override public String toString() { diff --git a/src/com/annimon/ownlang/lib/MapValue.java b/src/com/annimon/ownlang/lib/MapValue.java index c636a17..fb54763 100644 --- a/src/com/annimon/ownlang/lib/MapValue.java +++ b/src/com/annimon/ownlang/lib/MapValue.java @@ -1,6 +1,7 @@ package com.annimon.ownlang.lib; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Objects; @@ -8,14 +9,18 @@ import java.util.Objects; * * @author aNNiMON */ -public final class MapValue implements Value { +public class MapValue implements Value, Iterable> { private final Map map; public MapValue(int size) { this.map = new HashMap<>(size); } - + + public MapValue(Map map) { + this.map = map; + } + public Value get(Value key) { return map.get(key); } @@ -23,7 +28,7 @@ public final class MapValue implements Value { public void set(Value key, Value value) { map.put(key, value); } - + @Override public double asNumber() { throw new RuntimeException("Cannot cast map to number"); @@ -34,6 +39,11 @@ public final class MapValue implements Value { return map.toString(); } + @Override + public Iterator> iterator() { + return map.entrySet().iterator(); + } + @Override public int hashCode() { int hash = 5; @@ -51,8 +61,6 @@ public final class MapValue implements Value { return Objects.equals(this.map, other.map); } - - @Override public String toString() { return asString(); diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_foreach.java b/src/com/annimon/ownlang/lib/modules/functions/std_foreach.java new file mode 100644 index 0000000..eac4b96 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/std_foreach.java @@ -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 element : map) { + function.execute(element.getKey(), element.getValue()); + } + return NumberValue.ZERO; + } + return NumberValue.ZERO; + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/std.java b/src/com/annimon/ownlang/lib/modules/std.java index 3b8c725..dfa4409 100644 --- a/src/com/annimon/ownlang/lib/modules/std.java +++ b/src/com/annimon/ownlang/lib/modules/std.java @@ -1,13 +1,7 @@ package com.annimon.ownlang.lib.modules; import com.annimon.ownlang.lib.*; -import com.annimon.ownlang.lib.modules.functions.std_echo; -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; +import com.annimon.ownlang.lib.modules.functions.*; /** * @@ -18,6 +12,7 @@ public final class std implements Module { @Override public void init() { Functions.set("echo", new std_echo()); + Functions.set("foreach", new std_foreach()); Functions.set("newarray", new std_newarray()); Functions.set("rand", new std_rand()); Functions.set("sleep", new std_sleep());