Skip to content

Commit a867097

Browse files
committed
remove minus macro
1 parent 32a5ef8 commit a867097

File tree

5 files changed

+50
-75
lines changed

5 files changed

+50
-75
lines changed

poly

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
#!/usr/bin/env bash
2-
java --module-path $(./get_module_path) --module io.polypen/io.polypen.Main $@
2+
~/.jdks/corretto-22.0.2/bin/java --module-path $(./get_module_path) --module io.polypen/io.polypen.Main $@

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

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,21 @@
11
package io.polypen.parse;
22

3-
import io.polypen.parse.Parser.BindingMinusExpr;
43
import io.polypen.parse.Parser.Expr;
54
import io.polypen.parse.Parser.ListExpr;
65
import io.polypen.parse.Parser.MinusExpr;
76
import io.polypen.parse.Parser.MultExpr;
87
import io.polypen.parse.Parser.MultListExpr;
8+
import io.polypen.parse.Parser.NumberExpr;
99
import io.polypen.parse.Parser.PlusExpr;
1010
import io.polypen.parse.Parser.PlusListExpr;
1111

12-
import java.util.ArrayList;
1312
import java.util.List;
1413

1514
public class Macro {
1615

17-
public static Expr minusMacro(Expr exprs) {
18-
if (exprs.size() == 1) {
19-
return exprs;
20-
}
21-
Expr previous = null;
22-
List<Expr> result = new ArrayList<>(exprs.size());
23-
for (Expr expr : exprs.getExprs()) {
24-
if (previous instanceof MinusExpr) {
25-
result.add(BindingMinusExpr.of(minusMacro(expr)));
26-
} else {
27-
if (!(expr instanceof MinusExpr)) {
28-
result.add(minusMacro(expr));
29-
}
30-
}
31-
previous = expr;
32-
}
33-
return new ListExpr(result);
34-
}
16+
public static final int B_STRONG = 4;
17+
public static final int B_MINUSBOUND = 16;
18+
public static final int B_END = 1;
3519

3620
public static Expr applyStarMacro(List<Expr> exprs) {
3721
if (exprs.size() == 1) {
@@ -44,35 +28,47 @@ public static Expr applyStarMacro(List<Expr> exprs) {
4428
Expr left = exprs.get(i);
4529
Expr right = exprs.get(i + 1);
4630
if (isStrong(left, right)) {
47-
bound[i] = 1;
48-
bound[i + 1] = 1;
49-
} else {
50-
bound[i] *= 2;
31+
bound[i] |= B_STRONG;
32+
bound[i + 1] |= B_STRONG;
33+
if (left instanceof MinusExpr) {
34+
bound[i + 1] |= B_MINUSBOUND;
35+
}
36+
} else if ((bound[i] & B_STRONG) != 0) {
37+
bound[i] |= B_END;
5138
}
5239
}
5340
for (int i = 0; i < exprs.size(); i++) {
5441
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();
42+
int b = bound[i];
43+
if ((b & B_STRONG) != 0) {
44+
if ((b & B_MINUSBOUND) != 0) {
45+
region.add(MultListExpr.of(NumberExpr.of(-1), expandRecursively(expr)));
46+
} else {
47+
region.add(expandRecursively(expr));
48+
}
49+
if ((b & B_END) != 0) {
50+
exprsCopy.add(unwrap(region.copy()));
51+
region.clear();
52+
}
6153
} else {
6254
if (!region.isEmpty()) {
63-
exprsCopy.add(region.copy());
55+
exprsCopy.add(unwrap(region.copy()));
6456
region.clear();
6557
}
6658
exprsCopy.add(expandRecursively(expr));
6759
}
6860
}
6961
if (exprsCopy.isEmpty()) {
70-
return region;
62+
return unwrap(region);
7163
}
7264
if (!region.isEmpty()) {
73-
exprsCopy.add(region);
65+
exprsCopy.add(unwrap(region));
7466
}
75-
return exprsCopy;
67+
return unwrap(exprsCopy);
68+
}
69+
70+
private static Expr unwrap(Expr expr) {
71+
return expr.size() == 1 ? expr.getFirst() : expr;
7672
}
7773

7874
private static Expr expandRecursively(Expr expr) {
@@ -81,7 +77,6 @@ private static Expr expandRecursively(Expr expr) {
8177
}
8278
return switch (expr) {
8379
case ListExpr x -> applyStarMacro(x.value());
84-
case BindingMinusExpr x -> BindingMinusExpr.of(expandRecursively(x.expr()));
8580
default -> expr;
8681
};
8782
}
@@ -93,7 +88,10 @@ public static boolean isStrong(Expr left, Expr right) {
9388
if (left instanceof PlusExpr || right instanceof PlusExpr) {
9489
return false;
9590
}
96-
if (right instanceof BindingMinusExpr) {
91+
if (left instanceof MinusExpr) {
92+
return true;
93+
}
94+
if (right instanceof MinusExpr) {
9795
return false;
9896
}
9997
return true;

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

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public static ListExpr parse(String s) {
114114
}
115115
}
116116

117-
public sealed interface Expr permits PlusExpr, MinusExpr, MultExpr, ListExpr, NumberExpr, VarExp, PlusListExpr, MultListExpr, BindingMinusExpr {
117+
public sealed interface Expr permits PlusExpr, MinusExpr, MultExpr, ListExpr, NumberExpr, VarExp, PlusListExpr, MultListExpr {
118118
int size();
119119

120120
Expr getFirst();
@@ -195,8 +195,7 @@ public List<Expr> getExprs() {
195195
public static final Expr MULT = new MultExpr();
196196

197197
public static Polynomial eval(Expr expr) {
198-
List<Expr> expanded = Macro.minusMacro(expr).getExprs();
199-
Expr exprs = Macro.applyStarMacro(expanded);
198+
Expr exprs = Macro.applyStarMacro(expr.getExprs());
200199
return _eval(exprs);
201200
}
202201

@@ -242,7 +241,6 @@ private static Polynomial _eval(Expr exprs) {
242241
}
243242
case NumberExpr numberExpr -> new Monomial(numberExpr.value, 0).polynomial();
244243
case VarExp varExp -> new Monomial(1, varExp.exp).polynomial();
245-
case BindingMinusExpr minEx -> _eval(minEx.expr).multiply(-1);
246244
default -> throw new IllegalStateException(exprs.toString());
247245
};
248246
}
@@ -321,32 +319,6 @@ private static void addIfNotOperator(List<Expr> exprs, Expr expr) {
321319
}
322320
}
323321

324-
public record BindingMinusExpr(Expr expr) implements Expr {
325-
public static BindingMinusExpr of(Expr expr) {
326-
return new BindingMinusExpr(expr);
327-
}
328-
329-
@Override
330-
public String toString() {
331-
return "-" + expr;
332-
}
333-
334-
@Override
335-
public int size() {
336-
return 1;
337-
}
338-
339-
@Override
340-
public Expr getFirst() {
341-
return expr;
342-
}
343-
344-
@Override
345-
public List<Expr> getExprs() {
346-
return List.of(expr);
347-
}
348-
}
349-
350322
public record PlusListExpr(List<Expr> value) implements Expr {
351323
public static PlusListExpr create(int capacity) {
352324
return new PlusListExpr(new ArrayList<>(capacity));

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

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

3+
import io.polypen.parse.Macro;
34
import io.polypen.parse.Parser;
45
import io.polypen.parse.Parser.ListExpr;
56
import org.junit.jupiter.api.Test;
67

8+
import java.util.List;
9+
710
import static io.polypen.Polynomial.parse;
811
import static io.polypen.parse.Parser.eval;
912
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -41,6 +44,11 @@ void monomialMultiplication() {
4144
@Test
4245
void monomialMultiplication2() {
4346
ListExpr p = Parser.parse("2x - 1");
47+
List<Parser.Expr> exprs = Macro.applyStarMacro(p.getExprs()).getExprs();
48+
for (int i = 0; i < exprs.size(); i++) {
49+
Parser.Expr expr = exprs.get(i);
50+
System.out.println(i + ": " + expr);
51+
}
4452
assertEquals(new Monomial(2, 1).polynomial()
4553
.add(new Monomial(-1, 0).polynomial()),
4654
eval(p));

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@
22

33
import io.polypen.Monomial;
44
import io.polypen.Polynomial;
5-
import io.polypen.parse.Parser.BindingMinusExpr;
65
import org.junit.jupiter.api.Test;
76

8-
import java.util.List;
9-
107
import static io.polypen.parse.Macro.applyStarMacro;
11-
import static io.polypen.parse.Macro.minusMacro;
128
import static io.polypen.parse.Parser.Expr;
139
import static io.polypen.parse.Parser.ListExpr;
1410
import static io.polypen.parse.Parser.MULT;
@@ -90,11 +86,12 @@ void starMacro7() {
9086
@Test
9187
void starMacro8() {
9288
ListExpr result = parse("-(x - 1)");
93-
List<Expr> exprs = minusMacro(result).getExprs();
94-
Expr expanded = applyStarMacro(exprs);
89+
Expr expanded = applyStarMacro(result.getExprs());
9590
assertEquals(
96-
BindingMinusExpr.of(
97-
PlusListExpr.of(VarExp.of("x", 1), BindingMinusExpr.of(NumberExpr.of(1)))),
91+
MultListExpr.of(
92+
NumberExpr.of(-1),
93+
PlusListExpr.of(VarExp.of("x", 1),
94+
MultListExpr.of(-1, 1))),
9895
expanded);
9996
}
10097

0 commit comments

Comments
 (0)