Добавлена функция 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

@ -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)
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;
import java.util.Arrays;
import java.util.Iterator;
/**
*
* @author aNNiMON
*/
public final class ArrayValue implements Value {
public final class ArrayValue implements Value, Iterable<Value> {
private final Value[] elements;
@ -41,6 +42,11 @@ public final class ArrayValue implements Value {
return Arrays.toString(elements);
}
@Override
public Iterator<Value> 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() {

View File

@ -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<Map.Entry<Value, Value>> {
private final Map<Value, Value> map;
public MapValue(int size) {
this.map = new HashMap<>(size);
}
public MapValue(Map<Value, Value> 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<Map.Entry<Value, Value>> 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();

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;
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());