Skip to content

Commit 0bb06b4

Browse files
committed
WIP #944 check if number of args in builtin-functions
1 parent 461ba62 commit 0bb06b4

File tree

1 file changed

+39
-8
lines changed
  • symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/expression

1 file changed

+39
-8
lines changed

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/expression/AbstractAST.java

+39-8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.matheclipse.core.eval.exception.Validate;
5151
import org.matheclipse.core.eval.exception.ValidateException;
5252
import org.matheclipse.core.eval.interfaces.ICoreFunctionEvaluator;
53+
import org.matheclipse.core.eval.interfaces.IFunctionEvaluator;
5354
import org.matheclipse.core.eval.interfaces.IRewrite;
5455
import org.matheclipse.core.eval.util.AbstractAssumptions;
5556
import org.matheclipse.core.eval.util.SourceCodeProperties;
@@ -1961,7 +1962,7 @@ public IExpr.COMPARE_TERNARY equalTernary(IExpr that, EvalEngine engine) {
19611962
@Override
19621963
public final INumber evalNumber() {
19631964
if (isNumericFunction(true)) {
1964-
IExpr result = EvalEngine.get().evalN(this);
1965+
IExpr result = EvalEngine.get().evalNumericFunction(this);
19651966
if (result.isNumber()) {
19661967
return (INumber) result;
19671968
}
@@ -1973,7 +1974,7 @@ public final INumber evalNumber() {
19731974
@Override
19741975
public final IReal evalReal() {
19751976
if (isNumericFunction(true)) {
1976-
IExpr result = EvalEngine.get().evalN(this);
1977+
IExpr result = EvalEngine.get().evalNumericFunction(this);
19771978
if (result.isReal()) {
19781979
return (IReal) result;
19791980
}
@@ -1986,7 +1987,7 @@ public final IReal evalReal() {
19861987
} else if (isAST(S.Labeled, 3, 4)) {
19871988
IExpr arg1 = arg1();
19881989
if (arg1.isNumericFunction(true)) {
1989-
IExpr result = EvalEngine.get().evalN(arg1);
1990+
IExpr result = EvalEngine.get().evalNumericFunction(arg1);
19901991
if (result.isReal()) {
19911992
return (IReal) result;
19921993
}
@@ -3963,8 +3964,7 @@ public final boolean isModuleOrWithCondition() {
39633964
@Override
39643965
public boolean isNegative() {
39653966
if (isNumericFunction(true)) {
3966-
3967-
IExpr result = EvalEngine.get().evalN(this);
3967+
IExpr result = EvalEngine.get().evalNumericFunction(this);
39683968
if (result.isReal()) {
39693969
return result.isNegative();
39703970
}
@@ -4050,6 +4050,9 @@ public boolean isNumericFunction(boolean allowList) {
40504050
if (header.isNumericFunctionAttribute() || isList()) {
40514051
// check if all arguments are "numeric"
40524052
boolean forAll = forAll(x -> x.isNumericFunction(allowList), 1);
4053+
if (forAll && !isList()) {
4054+
forAll = hasExpectedArgSize(header);
4055+
}
40534056
addEvalFlags(
40544057
forAll ? IAST.IS_NUMERIC_FUNCTION_OR_LIST : IAST.IS_NOT_NUMERIC_FUNCTION_OR_LIST);
40554058
return forAll;
@@ -4058,6 +4061,9 @@ public boolean isNumericFunction(boolean allowList) {
40584061
if (header.isNumericFunctionAttribute()) {
40594062
// check if all arguments are "numeric"
40604063
boolean forAll = forAll(x -> x.isNumericFunction(allowList), 1);
4064+
if (forAll) {
4065+
forAll = hasExpectedArgSize(header);
4066+
}
40614067
addEvalFlags(forAll ? IAST.IS_NUMERIC_FUNCTION : IAST.IS_NOT_NUMERIC_FUNCTION);
40624068
return forAll;
40634069
}
@@ -4066,6 +4072,28 @@ public boolean isNumericFunction(boolean allowList) {
40664072
return false;
40674073
}
40684074

4075+
private boolean hasExpectedArgSize(ISymbol header) {
4076+
if (header.isBuiltInSymbol()) {
4077+
IEvaluator evaluator = ((IBuiltInSymbol) header).getEvaluator();
4078+
if (evaluator instanceof IFunctionEvaluator) {
4079+
int[] expected = ((IFunctionEvaluator) evaluator).expectedArgSize(this);
4080+
if (expected != null) {
4081+
int argSize = argSize();
4082+
if (argSize < expected[0] || argSize > expected[1]
4083+
|| (expected[1] == Integer.MAX_VALUE && expected.length == 2)) {
4084+
if (argSize < expected[0]) {
4085+
return false;
4086+
}
4087+
if (argSize > expected[1]) {
4088+
return false;
4089+
}
4090+
}
4091+
}
4092+
}
4093+
}
4094+
return true;
4095+
}
4096+
40694097
/** {@inheritDoc} */
40704098
@Override
40714099
public boolean isNumericFunction(VariablesSet varSet) {
@@ -4254,7 +4282,7 @@ public final boolean isPolynomialOfMaxDegree(ISymbol variable, long maxDegree) {
42544282
@Override
42554283
public boolean isPositive() {
42564284
if (isNumericFunction(true)) {
4257-
IExpr result = EvalEngine.get().evalN(this);
4285+
IExpr result = EvalEngine.get().evalNumericFunction(this);
42584286
if (result.isReal()) {
42594287
return ((IReal) result).isPositive();
42604288
}
@@ -4399,9 +4427,12 @@ public boolean isRealResult() {
43994427
}
44004428
}
44014429
}
4402-
IReal e = evalReal();
4430+
INumber e = evalNumber();
44034431
if (e != null) {
4404-
return true;
4432+
if (e.isReal()) {
4433+
return true;
4434+
}
4435+
return false;
44054436
}
44064437
if (isPlus() || isTimes()) {
44074438
// check if all arguments are &quot;real values&quot;

0 commit comments

Comments
 (0)