Skip to content

Commit 6f71321

Browse files
committed
bad
1 parent ff8ea4c commit 6f71321

File tree

4 files changed

+98
-16
lines changed

4 files changed

+98
-16
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+
/opt/bohll/.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: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
public class Macro {
1818

19-
static Expr minusMacro(Expr exprs) {
19+
public static Expr minusMacro(Expr exprs) {
2020
if (exprs.size() == 1) {
2121
return exprs;
2222
}
@@ -51,15 +51,15 @@ private static boolean needsPlusInsert(Expr prev) {
5151
};
5252
}
5353

54-
static Expr applyStarMacro(List<Expr> exprs) {
54+
public static Expr applyStarMacro(List<Expr> exprs) {
5555
if (exprs.size() == 1) {
5656
return expandRecursively(exprs.getFirst());
5757
}
5858
PlusListExpr exprsCopy = PlusListExpr.create(exprs.size());
5959
MultListExpr region = MultListExpr.create(exprs.size());
6060
Expr previous = null;
6161
for (Expr expr : exprs) {
62-
if (isStrongBind(previous) && (isStrongBind(expr) || !region.isEmpty())) {
62+
if (isStrongBind(previous) && (isRightBind(expr) || !region.isEmpty())) {
6363
region.add(previous);
6464
} else {
6565
if (!region.isEmpty()) {
@@ -96,19 +96,34 @@ private static Expr expandRecursively(Expr expr) {
9696
};
9797
}
9898

99-
public static boolean isStrongBind(Expr expr) {
100-
if (expr == null) {
99+
public static boolean isStrongBind(Expr left, Expr right) {
100+
if (left == null) {
101101
return false;
102102
}
103-
return switch (expr) {
104-
case ListExpr ignored -> true;
105-
case PlusListExpr ignored -> true;
106-
case MultListExpr ignored -> true;
103+
return switch (left) {
104+
case ListExpr ignored -> !(right instanceof BindingMinusExpr);
105+
case PlusListExpr ignored -> !(right instanceof BindingMinusExpr);
106+
case MultListExpr ignored -> !(right instanceof BindingMinusExpr);
107107
case MultExpr ignored -> true;
108-
case NumberExpr ignored -> true;
109-
case VarExp ignored -> true;
110-
case BindingMinusExpr ignored -> true;
111-
default -> false;
108+
case NumberExpr ignored -> !(right instanceof BindingMinusExpr);
109+
case VarExp ignored -> !(right instanceof BindingMinusExpr);
110+
case BindingMinusExpr ignored -> !(right instanceof BindingMinusExpr);
111+
case PlusExpr ignored -> false;
112+
case MinusExpr ignored -> false;
112113
};
113114
}
115+
116+
public static boolean isRightBind(Expr expr) {
117+
if (expr == null) {
118+
return false;
119+
}
120+
return !(expr instanceof BindingMinusExpr) && !(expr instanceof PlusExpr);
121+
}
122+
123+
public static boolean isStrongBind(Expr expr) {
124+
if (expr == null) {
125+
return false;
126+
}
127+
return !(expr instanceof PlusExpr);
128+
}
114129
}

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: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package io.polypen;
22

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

7+
import java.util.List;
8+
59
import static io.polypen.Polynomial.parse;
10+
import static io.polypen.parse.Parser.eval;
611
import static org.junit.jupiter.api.Assertions.assertEquals;
712

813
class PolynomialTest {
@@ -30,8 +35,40 @@ void polynomialEquals() {
3035

3136
@Test
3237
void monomialMultiplication() {
33-
assertEquals(parse("2x^6 - 4x^2 - 2x"),
34-
new Monomial(2, 1).multiply(parse("x^5 - 2x - 1")));
38+
Parser.ListExpr p = Parser.parse("2x^6 - 4x^2 - 2x");
39+
System.out.println(p);
40+
List<Parser.Expr> minused = Macro.minusMacro(p).getExprs();
41+
System.out.println(minused);
42+
for (int i = 0; i < minused.size(); i++) {
43+
Parser.Expr expr = minused.get(i);
44+
System.out.println(i + ": " + expr);
45+
}
46+
Parser.Expr x = Macro.applyStarMacro(minused);
47+
System.out.println(x);
48+
for (int i = 0; i < x.getExprs().size(); i++) {
49+
Parser.Expr expr = x.getExprs().get(i);
50+
System.out.println(i + ": " + expr);
51+
}
52+
assertEquals(eval(p), new Monomial(2, 1).multiply(parse("x^5 - 2x - 1")));
53+
}
54+
55+
@Test
56+
void monomialMultiplication2() {
57+
Parser.ListExpr p = Parser.parse("2x - 1");
58+
System.out.println(p);
59+
List<Parser.Expr> minused = Macro.minusMacro(p).getExprs();
60+
System.out.println(minused);
61+
for (int i = 0; i < minused.size(); i++) {
62+
Parser.Expr expr = minused.get(i);
63+
System.out.println(i + ": " + expr);
64+
}
65+
Parser.Expr x = Macro.applyStarMacro(minused);
66+
System.out.println(x);
67+
for (int i = 0; i < x.getExprs().size(); i++) {
68+
Parser.Expr expr = x.getExprs().get(i);
69+
System.out.println(i + ": " + expr);
70+
}
71+
System.out.println(eval(p));
3572
}
3673

3774
@Test

0 commit comments

Comments
 (0)