mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Добавлена функция foreach
This commit is contained in:
parent
4004703cb6
commit
b6d3c30ee4
@ -88,3 +88,5 @@ map = {"+" : add, "-" : sub. "*" : mul, "/" : div}
|
||||
//print map["+"]
|
||||
print "\n"
|
||||
print function(map["+"], 4, 5)
|
||||
print "\n"
|
||||
foreach(map, def(op, func) = echo (4, op, 5, "=", func(4,5)))
|
||||
|
@ -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;
|
||||
@ -58,8 +64,6 @@ public final class ArrayValue implements Value {
|
||||
return Arrays.deepEquals(this.elements, other.elements);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return asString();
|
||||
|
@ -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,7 +9,7 @@ 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;
|
||||
|
||||
@ -16,6 +17,10 @@ public final class MapValue implements Value {
|
||||
this.map = new HashMap<>(size);
|
||||
}
|
||||
|
||||
public MapValue(Map<Value, Value> map) {
|
||||
this.map = map;
|
||||
}
|
||||
|
||||
public Value get(Value key) {
|
||||
return map.get(key);
|
||||
}
|
||||
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user