♻️ Replace the math expressions with own calculator

This commit is contained in:
2025-09-14 13:19:56 +08:00
parent 722ef9ca21
commit 2a56a83898
4 changed files with 90 additions and 13 deletions

View File

@@ -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)";
}