♻️ Replace the math expressions with own calculator
This commit is contained in:
@@ -7,6 +7,9 @@ abstract class Expr {
|
||||
/// 新增:对表达式进行“求值/数值化”——尽可能把可算的部分算出来
|
||||
Expr evaluate();
|
||||
|
||||
/// Substitute variable with value
|
||||
Expr substitute(String varName, Expr value);
|
||||
|
||||
@override
|
||||
String toString();
|
||||
|
||||
@@ -27,6 +30,9 @@ class IntExpr extends Expr {
|
||||
@override
|
||||
Expr evaluate() => this;
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => this;
|
||||
|
||||
@override
|
||||
String toString() => value.toString();
|
||||
}
|
||||
@@ -42,10 +48,31 @@ class DoubleExpr extends Expr {
|
||||
@override
|
||||
Expr evaluate() => this;
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => this;
|
||||
|
||||
@override
|
||||
String toString() => value.toString();
|
||||
}
|
||||
|
||||
// === VarExpr ===
|
||||
class VarExpr extends Expr {
|
||||
final String name;
|
||||
VarExpr(this.name);
|
||||
|
||||
@override
|
||||
Expr simplify() => this;
|
||||
|
||||
@override
|
||||
Expr evaluate() => this;
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => name == varName ? value : this;
|
||||
|
||||
@override
|
||||
String toString() => name;
|
||||
}
|
||||
|
||||
// === FractionExpr.evaluate ===
|
||||
class FractionExpr extends Expr {
|
||||
final int numerator;
|
||||
@@ -74,6 +101,9 @@ class FractionExpr extends Expr {
|
||||
@override
|
||||
Expr evaluate() => simplify();
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => this;
|
||||
|
||||
@override
|
||||
String toString() => "$numerator/$denominator";
|
||||
}
|
||||
@@ -150,6 +180,12 @@ class AddExpr extends Expr {
|
||||
return AddExpr(l, r);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => AddExpr(
|
||||
left.substitute(varName, value),
|
||||
right.substitute(varName, value),
|
||||
);
|
||||
|
||||
@override
|
||||
String toString() => "($left + $right)";
|
||||
}
|
||||
@@ -213,6 +249,12 @@ class SubExpr extends Expr {
|
||||
return SubExpr(l, r);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => SubExpr(
|
||||
left.substitute(varName, value),
|
||||
right.substitute(varName, value),
|
||||
);
|
||||
|
||||
@override
|
||||
String toString() => "($left - $right)";
|
||||
}
|
||||
@@ -296,6 +338,12 @@ class MulExpr extends Expr {
|
||||
return MulExpr(l, r);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => MulExpr(
|
||||
left.substitute(varName, value),
|
||||
right.substitute(varName, value),
|
||||
);
|
||||
|
||||
@override
|
||||
String toString() => "($left * $right)";
|
||||
}
|
||||
@@ -378,6 +426,12 @@ class DivExpr extends Expr {
|
||||
return DivExpr(l, r);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) => DivExpr(
|
||||
left.substitute(varName, value),
|
||||
right.substitute(varName, value),
|
||||
);
|
||||
|
||||
@override
|
||||
String toString() => "($left / $right)";
|
||||
}
|
||||
@@ -429,6 +483,10 @@ class SqrtExpr extends Expr {
|
||||
return SqrtExpr(i);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) =>
|
||||
SqrtExpr(inner.substitute(varName, value));
|
||||
|
||||
@override
|
||||
String toString() => "sqrt($inner)";
|
||||
}
|
||||
@@ -456,6 +514,10 @@ class CosExpr extends Expr {
|
||||
return CosExpr(i);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) =>
|
||||
CosExpr(inner.substitute(varName, value));
|
||||
|
||||
@override
|
||||
String toString() => "cos($inner)";
|
||||
}
|
||||
@@ -483,6 +545,10 @@ class SinExpr extends Expr {
|
||||
return SinExpr(i);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) =>
|
||||
SinExpr(inner.substitute(varName, value));
|
||||
|
||||
@override
|
||||
String toString() => "sin($inner)";
|
||||
}
|
||||
@@ -510,6 +576,10 @@ class TanExpr extends Expr {
|
||||
return TanExpr(i);
|
||||
}
|
||||
|
||||
@override
|
||||
Expr substitute(String varName, Expr value) =>
|
||||
TanExpr(inner.substitute(varName, value));
|
||||
|
||||
@override
|
||||
String toString() => "tan($inner)";
|
||||
}
|
||||
|
Reference in New Issue
Block a user