Skip to content

Commit 32a5ef8

Browse files
committed
simplify the macros
1 parent ff8ea4c commit 32a5ef8

File tree

3 files changed

+86
-48
lines changed

3 files changed

+86
-48
lines changed

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

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,80 +6,70 @@
66
import io.polypen.parse.Parser.MinusExpr;
77
import io.polypen.parse.Parser.MultExpr;
88
import io.polypen.parse.Parser.MultListExpr;
9-
import io.polypen.parse.Parser.NumberExpr;
109
import io.polypen.parse.Parser.PlusExpr;
1110
import io.polypen.parse.Parser.PlusListExpr;
12-
import io.polypen.parse.Parser.VarExp;
1311

1412
import java.util.ArrayList;
1513
import java.util.List;
1614

1715
public class Macro {
1816

19-
static Expr minusMacro(Expr exprs) {
17+
public static Expr minusMacro(Expr exprs) {
2018
if (exprs.size() == 1) {
2119
return exprs;
2220
}
23-
Expr old = null;
2421
Expr previous = null;
2522
List<Expr> result = new ArrayList<>(exprs.size());
2623
for (Expr expr : exprs.getExprs()) {
2724
if (previous instanceof MinusExpr) {
28-
if (needsPlusInsert(old)) {
29-
result.add(Parser.PLUS);
30-
}
3125
result.add(BindingMinusExpr.of(minusMacro(expr)));
3226
} else {
3327
if (!(expr instanceof MinusExpr)) {
3428
result.add(minusMacro(expr));
3529
}
3630
}
37-
old = previous;
3831
previous = expr;
3932
}
4033
return new ListExpr(result);
4134
}
4235

43-
private static boolean needsPlusInsert(Expr prev) {
44-
if (prev == null) {
45-
return false;
46-
}
47-
return switch (prev) {
48-
case PlusExpr ignored -> false;
49-
case MultExpr ignored -> false;
50-
default -> true;
51-
};
52-
}
53-
54-
static Expr applyStarMacro(List<Expr> exprs) {
36+
public static Expr applyStarMacro(List<Expr> exprs) {
5537
if (exprs.size() == 1) {
5638
return expandRecursively(exprs.getFirst());
5739
}
5840
PlusListExpr exprsCopy = PlusListExpr.create(exprs.size());
5941
MultListExpr region = MultListExpr.create(exprs.size());
60-
Expr previous = null;
61-
for (Expr expr : exprs) {
62-
if (isStrongBind(previous) && (isStrongBind(expr) || !region.isEmpty())) {
63-
region.add(previous);
42+
int[] bound = new int[exprs.size()];
43+
for (int i = 0; i < exprs.size() - 1; i++) {
44+
Expr left = exprs.get(i);
45+
Expr right = exprs.get(i + 1);
46+
if (isStrong(left, right)) {
47+
bound[i] = 1;
48+
bound[i + 1] = 1;
49+
} else {
50+
bound[i] *= 2;
51+
}
52+
}
53+
for (int i = 0; i < exprs.size(); i++) {
54+
Expr expr = exprs.get(i);
55+
if (bound[i] == 1) {
56+
region.add(expandRecursively(expr));
57+
} else if (bound[i] == 2) {
58+
region.add(expandRecursively(expr));
59+
exprsCopy.add(region.copy());
60+
region.clear();
6461
} else {
6562
if (!region.isEmpty()) {
6663
exprsCopy.add(region.copy());
6764
region.clear();
6865
}
69-
if (previous != null) {
70-
exprsCopy.add(previous);
71-
}
66+
exprsCopy.add(expandRecursively(expr));
7267
}
73-
previous = expandRecursively(expr);
7468
}
7569
if (exprsCopy.isEmpty()) {
76-
region.add(expandRecursively(previous));
7770
return region;
7871
}
79-
if (region.isEmpty()) {
80-
exprsCopy.add(expandRecursively(previous));
81-
} else {
82-
region.add(expandRecursively(previous));
72+
if (!region.isEmpty()) {
8373
exprsCopy.add(region);
8474
}
8575
return exprsCopy;
@@ -91,24 +81,21 @@ private static Expr expandRecursively(Expr expr) {
9181
}
9282
return switch (expr) {
9383
case ListExpr x -> applyStarMacro(x.value());
94-
case BindingMinusExpr x -> BindingMinusExpr.of(applyStarMacro(List.of(x.expr())));
84+
case BindingMinusExpr x -> BindingMinusExpr.of(expandRecursively(x.expr()));
9585
default -> expr;
9686
};
9787
}
9888

99-
public static boolean isStrongBind(Expr expr) {
100-
if (expr == null) {
89+
public static boolean isStrong(Expr left, Expr right) {
90+
if (left instanceof MultExpr || right instanceof MultExpr) {
91+
return true;
92+
}
93+
if (left instanceof PlusExpr || right instanceof PlusExpr) {
10194
return false;
10295
}
103-
return switch (expr) {
104-
case ListExpr ignored -> true;
105-
case PlusListExpr ignored -> true;
106-
case MultListExpr ignored -> true;
107-
case MultExpr ignored -> true;
108-
case NumberExpr ignored -> true;
109-
case VarExp ignored -> true;
110-
case BindingMinusExpr ignored -> true;
111-
default -> false;
112-
};
96+
if (right instanceof BindingMinusExpr) {
97+
return false;
98+
}
99+
return true;
113100
}
114101
}

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.io.PushbackReader;
1010
import java.util.ArrayList;
1111
import java.util.List;
12+
import java.util.Objects;
13+
import java.util.stream.Collectors;
1214
import java.util.stream.IntStream;
1315

1416
public final class Parser {
@@ -271,6 +273,11 @@ public static MultListExpr of(Expr... value) {
271273
return new MultListExpr(List.of(value));
272274
}
273275

276+
@Override
277+
public String toString() {
278+
return value.stream().map(Objects::toString).collect(Collectors.joining(" ", "(* ", ")"));
279+
}
280+
274281
public static MultListExpr of(int... value) {
275282
List<Expr> list = IntStream.of(value).mapToObj(NumberExpr::of).map(s -> (Expr) s).toList();
276283
return new MultListExpr(list);
@@ -319,6 +326,11 @@ public static BindingMinusExpr of(Expr expr) {
319326
return new BindingMinusExpr(expr);
320327
}
321328

329+
@Override
330+
public String toString() {
331+
return "-" + expr;
332+
}
333+
322334
@Override
323335
public int size() {
324336
return 1;
@@ -340,6 +352,11 @@ public static PlusListExpr create(int capacity) {
340352
return new PlusListExpr(new ArrayList<>(capacity));
341353
}
342354

355+
@Override
356+
public String toString() {
357+
return value.stream().map(Objects::toString).collect(Collectors.joining(" ", "(+ ", ")"));
358+
}
359+
343360
public static PlusListExpr of(Expr... value) {
344361
return new PlusListExpr(List.of(value));
345362
}
@@ -394,6 +411,11 @@ public static NumberExpr of(int value) {
394411
return new NumberExpr(value);
395412
}
396413

414+
@Override
415+
public String toString() {
416+
return Integer.toString(value);
417+
}
418+
397419
@Override
398420
public int size() {
399421
return 1;
@@ -415,6 +437,14 @@ public static VarExp of(String var, int exp) {
415437
return new VarExp(var, exp);
416438
}
417439

440+
@Override
441+
public String toString() {
442+
if (exp == 1) {
443+
return var;
444+
}
445+
return var + "^" + exp;
446+
}
447+
418448
@Override
419449
public int size() {
420450
return 1;

src/test/java/io/polypen/PolynomialTest.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package io.polypen;
22

3+
import io.polypen.parse.Parser;
4+
import io.polypen.parse.Parser.ListExpr;
35
import org.junit.jupiter.api.Test;
46

57
import static io.polypen.Polynomial.parse;
8+
import static io.polypen.parse.Parser.eval;
69
import static org.junit.jupiter.api.Assertions.assertEquals;
710

811
class PolynomialTest {
@@ -30,8 +33,26 @@ void polynomialEquals() {
3033

3134
@Test
3235
void monomialMultiplication() {
33-
assertEquals(parse("2x^6 - 4x^2 - 2x"),
34-
new Monomial(2, 1).multiply(parse("x^5 - 2x - 1")));
36+
ListExpr p = Parser.parse("2x^6 - 4x^2 - 2x");
37+
assertEquals(new Monomial(2, 1).multiply(parse("x^5 - 2x - 1")),
38+
eval(p));
39+
}
40+
41+
@Test
42+
void monomialMultiplication2() {
43+
ListExpr p = Parser.parse("2x - 1");
44+
assertEquals(new Monomial(2, 1).polynomial()
45+
.add(new Monomial(-1, 0).polynomial()),
46+
eval(p));
47+
}
48+
49+
@Test
50+
void monomialMultiplication3() {
51+
ListExpr p = Parser.parse("2x^2 - x - 1");
52+
assertEquals(new Monomial(2, 2).polynomial()
53+
.add(new Monomial(-1, 1).polynomial())
54+
.add(new Monomial(-1, 0).polynomial()),
55+
eval(p));
3556
}
3657

3758
@Test

0 commit comments

Comments
 (0)