Skip to content

Commit 19e809d

Browse files
committed
star macro fix
1 parent 6221dfa commit 19e809d

File tree

3 files changed

+39
-90
lines changed

3 files changed

+39
-90
lines changed

src/main/java/io/polypen/parse/Macro.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
public class Macro {
1515

1616
static Expr applyStarMacro(List<Expr> exprs) {
17+
if (exprs.size() == 1) {
18+
return expandRecursively(exprs.getFirst());
19+
}
1720
List<Expr> exprsCopy = new ArrayList<>(exprs.size());
1821
List<Expr> region = new ArrayList<>(exprs.size());
1922
Expr previous = null;
@@ -32,11 +35,8 @@ static Expr applyStarMacro(List<Expr> exprs) {
3235
previous = expandRecursively(expr);
3336
}
3437
if (exprsCopy.isEmpty()) {
35-
List<Expr> mapped = new ArrayList<>();
36-
for (Expr expr : exprs) {
37-
mapped.add(expandRecursively(expr));
38-
}
39-
return new MultListExpr(mapped);
38+
region.add(expandRecursively(previous));
39+
return new MultListExpr(region);
4040
}
4141
if (region.isEmpty()) {
4242
exprsCopy.add(expandRecursively(previous));
@@ -48,6 +48,9 @@ static Expr applyStarMacro(List<Expr> exprs) {
4848
}
4949

5050
private static Expr expandRecursively(Expr expr) {
51+
if (expr == null) {
52+
return null;
53+
}
5154
return switch (expr) {
5255
case ListExpr x -> applyStarMacro(x.value());
5356
default -> expr;

src/main/java/io/polypen/parse/Parser.java

Lines changed: 19 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -192,112 +192,46 @@ public List<Expr> getExprs() {
192192
public static final Expr MULT = new MultExpr();
193193

194194
public static Polynomial eval(Expr expr) {
195-
return switch (expr) {
195+
Expr exprs = Macro.applyStarMacro(expr.getExprs());
196+
return switch (exprs) {
196197
case PlusListExpr listExpr -> {
197198
if (listExpr.value.size() == 1) {
198199
yield eval(listExpr.value().getFirst());
199200
}
200-
Expr exprs = Macro.applyStarMacro(listExpr.value);
201201
if (exprs.size() == 1) {
202202
yield eval(exprs.getFirst());
203203
}
204-
Polynomial result;
205-
if (hasPlus(exprs)) {
206-
result = Polynomial.ZERO;
207-
int sign = 1;
208-
for (Expr exp : exprs.getExprs()) {
209-
if (isMinus(exp)) {
210-
sign = -1;
211-
continue;
212-
}
213-
if (isPlus(exp)) {
214-
sign = 1;
215-
continue;
216-
}
217-
Polynomial p = eval(exp);
218-
result = result.add(p.multiply(sign));
204+
Polynomial result = Polynomial.ZERO;
205+
int sign = 1;
206+
for (Expr exp : exprs.getExprs()) {
207+
if (isMinus(exp)) {
208+
sign = -1;
209+
continue;
219210
}
220-
} else {
221-
result = Polynomial.ONE;
222-
for (Expr exp : exprs.getExprs()) {
223-
if (isOperator(exp)) {
224-
continue;
225-
}
226-
Polynomial p = eval(exp);
227-
result = result.multiply(p);
211+
if (isPlus(exp)) {
212+
sign = 1;
213+
continue;
228214
}
215+
Polynomial p = eval(exp);
216+
result = result.add(p.multiply(sign));
229217
}
230218
yield result;
231219
}
232220
case MultListExpr listExpr -> {
233221
if (listExpr.value.size() == 1) {
234222
yield eval(listExpr.value().getFirst());
235223
}
236-
Expr exprs = Macro.applyStarMacro(listExpr.value);
237224
if (exprs.size() == 1) {
238225
yield eval(exprs.getFirst());
239226
}
240227
Polynomial result;
241-
if (hasPlus(exprs)) {
242-
result = Polynomial.ZERO;
243-
int sign = 1;
244-
for (Expr exp : exprs.getExprs()) {
245-
if (isMinus(exp)) {
246-
sign = -1;
247-
continue;
248-
}
249-
if (isPlus(exp)) {
250-
sign = 1;
251-
continue;
252-
}
253-
Polynomial p = eval(exp);
254-
result = result.add(p.multiply(sign));
255-
}
256-
} else {
257-
result = Polynomial.ONE;
258-
for (Expr exp : exprs.getExprs()) {
259-
if (isOperator(exp)) {
260-
continue;
261-
}
262-
Polynomial p = eval(exp);
263-
result = result.multiply(p);
264-
}
265-
}
266-
yield result;
267-
}
268-
case ListExpr listExpr -> {
269-
if (listExpr.value.size() == 1) {
270-
yield eval(listExpr.value().getFirst());
271-
}
272-
Expr exprs = Macro.applyStarMacro(listExpr.value);
273-
if (exprs.size() == 1) {
274-
yield eval(exprs.getFirst());
275-
}
276-
Polynomial result;
277-
if (hasPlus(exprs)) {
278-
result = Polynomial.ZERO;
279-
int sign = 1;
280-
for (Expr exp : exprs.getExprs()) {
281-
if (isMinus(exp)) {
282-
sign = -1;
283-
continue;
284-
}
285-
if (isPlus(exp)) {
286-
sign = 1;
287-
continue;
288-
}
289-
Polynomial p = eval(exp);
290-
result = result.add(p.multiply(sign));
291-
}
292-
} else {
293-
result = Polynomial.ONE;
294-
for (Expr exp : exprs.getExprs()) {
295-
if (isOperator(exp)) {
296-
continue;
297-
}
298-
Polynomial p = eval(exp);
299-
result = result.multiply(p);
228+
result = Polynomial.ONE;
229+
for (Expr exp : exprs.getExprs()) {
230+
if (isOperator(exp)) {
231+
continue;
300232
}
233+
Polynomial p = eval(exp);
234+
result = result.multiply(p);
301235
}
302236
yield result;
303237
}

src/test/java/io/polypen/parse/ParserTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static io.polypen.parse.Macro.applyStarMacro;
88
import static io.polypen.parse.Parser.Expr;
99
import static io.polypen.parse.Parser.ListExpr;
10+
import static io.polypen.parse.Parser.MINUS;
1011
import static io.polypen.parse.Parser.MULT;
1112
import static io.polypen.parse.Parser.MultListExpr;
1213
import static io.polypen.parse.Parser.NumberExpr;
@@ -84,6 +85,17 @@ void starMacro7() {
8485
expanded);
8586
}
8687

88+
@Test
89+
void starMacro8() {
90+
ListExpr result = parse("-(x - 1)");
91+
Expr expanded = applyStarMacro(result.value());
92+
assertEquals(
93+
PlusListExpr.of(
94+
MINUS,
95+
PlusListExpr.of(VarExp.of("x", 1), MINUS, NumberExpr.of(1))),
96+
expanded);
97+
}
98+
8799
@Test
88100
void starMacro4() {
89101
ListExpr result = parse("1 * (2 + 3)");

0 commit comments

Comments
 (0)