Функции из std вынесены в отдельный пакет

This commit is contained in:
Victor 2016-01-08 21:15:47 +02:00
parent cea99d4105
commit d3f5212f88
6 changed files with 126 additions and 71 deletions

View File

@ -0,0 +1,18 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
public final class std_echo implements Function {
@Override
public Value execute(Value... args) {
for (Value arg : args) {
System.out.print(arg.asString());
System.out.print(" ");
}
System.out.println();
return NumberValue.ZERO;
}
}

View File

@ -0,0 +1,30 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
public final class std_newarray implements Function {
@Override
public Value execute(Value... args) {
return createArray(args, 0);
}
private ArrayValue createArray(Value[] args, int index) {
final int size = (int) args[index].asNumber();
final int last = args.length - 1;
ArrayValue array = new ArrayValue(size);
if (index == last) {
for (int i = 0; i < size; i++) {
array.set(i, NumberValue.ZERO);
}
} else if (index < last) {
for (int i = 0; i < size; i++) {
array.set(i, createArray(args, index + 1));
}
}
return array;
}
}

View File

@ -0,0 +1,27 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
import java.util.Random;
public final class std_rand implements Function {
private static final Random RND = new Random();
@Override
public Value execute(Value... args) {
if (args.length == 0) return new NumberValue(RND.nextDouble());
int from = 0;
int to = 100;
if (args.length == 1) {
to = (int) args[0].asNumber();
} else if (args.length == 2) {
from = (int) args[0].asNumber();
to = (int) args[1].asNumber();
}
return new NumberValue(RND.nextInt(to - from) + from);
}
}

View File

@ -0,0 +1,20 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
public final class std_sleep implements Function {
@Override
public Value execute(Value... args) {
if (args.length == 1) {
try {
Thread.sleep((long) args[0].asNumber());
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
return NumberValue.ZERO;
}
}

View File

@ -0,0 +1,20 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.Functions;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
public final class std_thread implements Function {
@Override
public Value execute(Value... args) {
if (args.length == 1) {
// Создаём новый поток по имени функции
new Thread(() -> {
Functions.get(args[0].asString()).execute();
}).start();
}
return NumberValue.ZERO;
}
}

View File

@ -1,6 +1,12 @@
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.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 java.util.Random;
/** /**
@ -11,76 +17,10 @@ public final class std implements Module {
@Override @Override
public void init() { public void init() {
Functions.set("echo", args -> { Functions.set("echo", new std_echo());
for (Value arg : args) { Functions.set("newarray", new std_newarray());
System.out.print(arg.asString()); Functions.set("rand", new std_rand());
System.out.print(" "); Functions.set("sleep", new std_sleep());
} Functions.set("thread", new std_thread());
System.out.println();
return NumberValue.ZERO;
});
Functions.set("newarray", new Function() {
@Override
public Value execute(Value... args) {
return createArray(args, 0);
}
private ArrayValue createArray(Value[] args, int index) {
final int size = (int) args[index].asNumber();
final int last = args.length - 1;
ArrayValue array = new ArrayValue(size);
if (index == last) {
for (int i = 0; i < size; i++) {
array.set(i, NumberValue.ZERO);
}
} else if (index < last) {
for (int i = 0; i < size; i++) {
array.set(i, createArray(args, index + 1));
}
}
return array;
}
});
Functions.set("rand", new Rand());
Functions.set("sleep", args -> {
if (args.length == 1) {
try {
Thread.sleep((long) args[0].asNumber());
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
return NumberValue.ZERO;
});
Functions.set("thread", args -> {
if (args.length == 1) {
// Создаём новый поток по имени функции
new Thread(() -> {
Functions.get(args[0].asString()).execute();
}).start();
}
return NumberValue.ZERO;
});
}
private static class Rand implements Function {
private static final Random RND = new Random();
@Override
public Value execute(Value... args) {
if (args.length == 0) return new NumberValue(RND.nextDouble());
int from = 0;
int to = 100;
if (args.length == 1) {
to = (int) args[0].asNumber();
} else if (args.length == 2) {
from = (int) args[0].asNumber();
to = (int) args[1].asNumber();
}
return new NumberValue(RND.nextInt(to - from) + from);
}
} }
} }