Добавлены функции в модуль math

This commit is contained in:
Victor 2015-07-11 21:17:21 +03:00
parent 0883845872
commit 62b1707de9

View File

@ -1,9 +1,9 @@
package com.annimon.ownlang.lib.modules; package com.annimon.ownlang.lib.modules;
import com.annimon.ownlang.lib.Function; import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.Functions; import java.util.function.DoubleBinaryOperator;
import com.annimon.ownlang.lib.NumberValue; import java.util.function.DoubleFunction;
import com.annimon.ownlang.lib.Value; import java.util.function.DoubleUnaryOperator;
/** /**
* *
@ -11,16 +11,35 @@ import com.annimon.ownlang.lib.Value;
*/ */
public final class math implements Module { public final class math implements Module {
private static final DoubleFunction<NumberValue> doubleToNumber = v -> new NumberValue(v);
@Override @Override
public void init() { public void init() {
Functions.set("sin", args -> { Functions.set("abs", functionConvert(Math::abs));
if (args.length != 1) throw new RuntimeException("One arg expected"); Functions.set("cos", functionConvert(Math::cos));
return new NumberValue(Math.sin(args[0].asNumber())); Functions.set("sin", functionConvert(Math::sin));
}); Functions.set("sqrt", functionConvert(Math::sqrt));
Functions.set("cos", args -> { Functions.set("toDegrees", functionConvert(Math::toDegrees));
if (args.length != 1) throw new RuntimeException("One arg expected"); Functions.set("toRadians", functionConvert(Math::toRadians));
return new NumberValue(Math.cos(args[0].asNumber()));
}); Functions.set("pow", biFunctionConvert(Math::pow));
Functions.set("atan2", biFunctionConvert(Math::atan2));
Variables.set("PI", new NumberValue(Math.PI));
Variables.set("E", new NumberValue(Math.E));
} }
private static Function functionConvert(DoubleUnaryOperator op) {
return args -> {
if (args.length != 1) throw new RuntimeException("One arg expected");
return doubleToNumber.apply(op.applyAsDouble(args[0].asNumber()));
};
}
private static Function biFunctionConvert(DoubleBinaryOperator op) {
return args -> {
if (args.length != 2) throw new RuntimeException("Two args expected");
return doubleToNumber.apply(op.applyAsDouble(args[0].asNumber(), args[1].asNumber()));
};
}
} }