mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44: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 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)))
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
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());
|
||||||
|
Loading…
Reference in New Issue
Block a user