mirror of
https://github.com/DanilaFe/abacus
synced 2024-12-22 07:20:09 -08:00
Move two more operators into separate classes.
This commit is contained in:
parent
81d0999c11
commit
579ff78a99
|
@ -5,10 +5,7 @@ import org.nwapw.abacus.function.*;
|
||||||
import org.nwapw.abacus.number.NaiveNumber;
|
import org.nwapw.abacus.number.NaiveNumber;
|
||||||
import org.nwapw.abacus.number.NumberInterface;
|
import org.nwapw.abacus.number.NumberInterface;
|
||||||
import org.nwapw.abacus.number.PreciseNumber;
|
import org.nwapw.abacus.number.PreciseNumber;
|
||||||
import org.nwapw.abacus.plugin.standard.OperatorAdd;
|
import org.nwapw.abacus.plugin.standard.*;
|
||||||
import org.nwapw.abacus.plugin.standard.OperatorDivide;
|
|
||||||
import org.nwapw.abacus.plugin.standard.OperatorMultiply;
|
|
||||||
import org.nwapw.abacus.plugin.standard.OperatorSubtract;
|
|
||||||
import org.nwapw.abacus.tree.TreeNode;
|
import org.nwapw.abacus.tree.TreeNode;
|
||||||
import org.nwapw.abacus.tree.VariableNode;
|
import org.nwapw.abacus.tree.VariableNode;
|
||||||
|
|
||||||
|
@ -65,17 +62,7 @@ public class StandardPlugin extends Plugin {
|
||||||
/**
|
/**
|
||||||
* The negation operator, -
|
* The negation operator, -
|
||||||
*/
|
*/
|
||||||
public static final NumberOperator OP_NEGATE = new NumberOperator(OperatorAssociativity.LEFT, OperatorType.UNARY_PREFIX, 0) {
|
public static final NumberOperator OP_NEGATE = new OperatorNegate();
|
||||||
@Override
|
|
||||||
public boolean matchesParams(MutableEvaluationContext context, NumberInterface[] params) {
|
|
||||||
return params.length == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NumberInterface applyInternal(MutableEvaluationContext context, NumberInterface[] params) {
|
|
||||||
return params[0].negate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/**
|
/**
|
||||||
* The multiplication operator, *
|
* The multiplication operator, *
|
||||||
*/
|
*/
|
||||||
|
@ -138,36 +125,7 @@ public class StandardPlugin extends Plugin {
|
||||||
/**
|
/**
|
||||||
* The factorial operator, !
|
* The factorial operator, !
|
||||||
*/
|
*/
|
||||||
public static final NumberOperator OP_FACTORIAL = new NumberOperator(OperatorAssociativity.RIGHT, OperatorType.UNARY_POSTFIX, 0) {
|
public static final NumberOperator OP_FACTORIAL = new OperatorFactorial();
|
||||||
//private HashMap<Class<? extends NumberInterface>, ArrayList<NumberInterface>> storedList = new HashMap<Class<? extends NumberInterface>, ArrayList<NumberInterface>>();
|
|
||||||
@Override
|
|
||||||
public boolean matchesParams(MutableEvaluationContext context, NumberInterface[] params) {
|
|
||||||
return params.length == 1
|
|
||||||
&& params[0].fractionalPart().compareTo(context.getInheritedNumberImplementation().instanceForString("0")) == 0
|
|
||||||
&& params[0].signum() >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NumberInterface applyInternal(MutableEvaluationContext context, NumberInterface[] params) {
|
|
||||||
NumberImplementation implementation = context.getInheritedNumberImplementation();
|
|
||||||
if (params[0].signum() == 0) {
|
|
||||||
return implementation.instanceForString("1");
|
|
||||||
}
|
|
||||||
NumberInterface one = implementation.instanceForString("1");
|
|
||||||
NumberInterface factorial = params[0];
|
|
||||||
NumberInterface multiplier = params[0];
|
|
||||||
//It is necessary to later prevent calls of factorial on anything but non-negative integers.
|
|
||||||
while ((multiplier = multiplier.subtract(one)).signum() == 1) {
|
|
||||||
factorial = factorial.multiply(multiplier);
|
|
||||||
}
|
|
||||||
return factorial;
|
|
||||||
/*if(!storedList.containsKey(params[0].getClass())){
|
|
||||||
storedList.put(params[0].getClass(), new ArrayList<NumberInterface>());
|
|
||||||
storedList.get(params[0].getClass()).add(NaiveNumber.ONE.promoteTo(params[0].getClass()));
|
|
||||||
storedList.get(params[0].getClass()).add(NaiveNumber.ONE.promoteTo(params[0].getClass()));
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/**
|
/**
|
||||||
* The permutation operator.
|
* The permutation operator.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.nwapw.abacus.plugin.standard
|
||||||
|
|
||||||
|
import org.nwapw.abacus.context.MutableEvaluationContext
|
||||||
|
import org.nwapw.abacus.function.NumberOperator
|
||||||
|
import org.nwapw.abacus.function.OperatorAssociativity
|
||||||
|
import org.nwapw.abacus.function.OperatorType
|
||||||
|
import org.nwapw.abacus.number.NumberInterface
|
||||||
|
|
||||||
|
class OperatorFactorial: NumberOperator(OperatorAssociativity.LEFT, OperatorType.UNARY_POSTFIX, 0) {
|
||||||
|
|
||||||
|
override fun matchesParams(context: MutableEvaluationContext, params: Array<out NumberInterface>) =
|
||||||
|
params.size == 1
|
||||||
|
&& params[0].fractionalPart().compareTo(context.inheritedNumberImplementation.instanceForString("0")) == 0
|
||||||
|
&& params[0].signum() >= 0
|
||||||
|
|
||||||
|
override fun applyInternal(context: MutableEvaluationContext, params: Array<out NumberInterface>): NumberInterface {
|
||||||
|
val implementation = context.inheritedNumberImplementation
|
||||||
|
val one = implementation.instanceForString("1")
|
||||||
|
if (params[0].signum() == 0) {
|
||||||
|
return one
|
||||||
|
}
|
||||||
|
var factorial = params[0]
|
||||||
|
var multiplier = params[0] - one
|
||||||
|
//It is necessary to later prevent calls of factorial on anything but non-negative integers.
|
||||||
|
while (multiplier.signum() == 1) {
|
||||||
|
factorial *= multiplier
|
||||||
|
multiplier -= one
|
||||||
|
}
|
||||||
|
return factorial
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package org.nwapw.abacus.plugin.standard
|
||||||
|
|
||||||
|
import org.nwapw.abacus.context.MutableEvaluationContext
|
||||||
|
import org.nwapw.abacus.function.NumberOperator
|
||||||
|
import org.nwapw.abacus.function.OperatorAssociativity
|
||||||
|
import org.nwapw.abacus.function.OperatorType
|
||||||
|
import org.nwapw.abacus.number.NumberInterface
|
||||||
|
|
||||||
|
class OperatorNegate: NumberOperator(OperatorAssociativity.LEFT, OperatorType.UNARY_PREFIX, 0) {
|
||||||
|
|
||||||
|
override fun matchesParams(context: MutableEvaluationContext, params: Array<out NumberInterface>) =
|
||||||
|
params.size == 1
|
||||||
|
|
||||||
|
override fun applyInternal(context: MutableEvaluationContext, params: Array<out NumberInterface>) =
|
||||||
|
-params[0]
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user