Skip to content

Commit 07483f2

Browse files
committed
wip commit for scala issue 12546
scala/scala3#12546
1 parent 2b8efbf commit 07483f2

File tree

13 files changed

+60
-37
lines changed

13 files changed

+60
-37
lines changed

Diff for: build.sbt

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import sbtcrossproject.CrossPlugin.autoImport.{CrossType, crossProject}
22
import scala.sys.process._
33

4+
45
ThisBuild / version := {
56
Option("git tag -l --points-at HEAD".!!.trim)
67
.filter(_.nonEmpty)

Diff for: examples/src/main/scala/plotter/FunctionPlotterCli.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ object Main {
4949

5050
def main(args: Array[String]): Unit = {
5151
ConfigParser.parse(args, Config()).foreach { config =>
52-
val parsed = lang.parse(config.term).get
52+
val parsed = lang.parse(config.term).get
5353
val derived = lang.derive(parsed)(X)
54-
val f = (x: Double) => lang.evaluate(parsed){ case X => x }
55-
val `f'` = (x: Double) => lang.evaluate(derived){ case X => x }
54+
val f = (x: Double) => lang.evaluate(parsed) { case X => x }
55+
val `f'` = (x: Double) => lang.evaluate(derived) { case X => x }
5656

5757
val p1 = new XYSeries(s"f(x)": Comparable[_], false, true)
5858
val p2 = new XYSeries(s"f'(x)": Comparable[_], false, true)

Diff for: math-parser-spire/src/test/scala/mathParser/algebra/OptimizationSpec.scala

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ class OptimizationSpec extends AnyFunSuite with Matchers {
1717
testLanguage(SpireLanguages.realLanguage, "real language")
1818
testLanguage(SpireLanguages.complexLanguage, "complex language")
1919

20-
def testLanguage[A: Field: Trig: NRoot: LiteralParser](_lang: Language[NumberUnitaryOperator, NumberBinaryOperator, A, Nothing], langName: String) = {
20+
def testLanguage[A: Field: Trig: NRoot: LiteralParser](
21+
_lang: Language[NumberUnitaryOperator, NumberBinaryOperator, A, Nothing],
22+
langName: String
23+
) = {
2124
val lang = _lang.withVariables[X.type](List("x" -> X))
2225

2326
val identities = Seq(

Diff for: math-parser-spire/src/test/scala/mathParser/algebra/ParseSpec.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class ParseSpec extends AnyFunSuite with Matchers {
2424
testTemplate(SpireLanguages.realLanguage.withVariables[V](vList), "real language")
2525
testTemplate(SpireLanguages.complexLanguage.withVariables[V](vList), "complex language")
2626

27-
def testTemplate[A: Field: Trig: NRoot: LiteralParser](lang: Language[NumberUnitaryOperator, NumberBinaryOperator,A, V], langName: String) = {
27+
def testTemplate[A: Field: Trig: NRoot: LiteralParser](lang: Language[NumberUnitaryOperator, NumberBinaryOperator, A, V], langName: String) = {
2828
test(s"$langName: parsing constants, literals and variables") {
2929
for ((name, value) <- lang.constants)
3030
lang.parse(name) shouldEqual Some(lang.constantNode(value))
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package mathParser
2+
3+
trait BinaryOperator
4+
trait UnitaryOperator

Diff for: math-parser/src/main/scala/mathParser/number/ComplexEvaluate.scala

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ package mathParser.number
22

33
import mathParser.Evaluate
44

5-
import NumberBinaryOperator.*
6-
import NumberUnitaryOperator.*
5+
import mathParser.number.NumberOperator.*
76

87
final class ComplexEvaluate[V] extends Evaluate[NumberUnitaryOperator, NumberBinaryOperator, Complex, V] {
98

109
import Math._
1110

12-
def executeUnitary(uo: NumberUnitaryOperator, a: Complex): Complex = uo match {
11+
def executeUnitary(uo: NumberUnitaryOperator, a: Complex): Complex = (uo: Any) match {
1312
case Neg => complexNeg(a)
1413
case Sin => complexSin(a)
1514
case Cos => complexCos(a)
@@ -22,15 +21,18 @@ final class ComplexEvaluate[V] extends Evaluate[NumberUnitaryOperator, NumberBin
2221
case Tanh => complexTanh(a)
2322
case Exp => complexExp(a)
2423
case Log => complexLog(a)
24+
case _ => ???
2525
}
2626

2727
def executeBinaryOperator(bo: NumberBinaryOperator, a: Complex, b: Complex): Complex =
28-
bo match {
28+
(bo: Any) match {
2929
case Plus => complexPlus(a, b)
3030
case Minus => complexMinus(a, b)
3131
case Times => complexTimes(a, b)
3232
case Divided => complexDivided(a, b)
3333
case Power => complexPower(a, b)
34+
case _ => ???
35+
3436
}
3537

3638
inline private final def sq(a: Double): Double = a * a

Diff for: math-parser/src/main/scala/mathParser/number/ComplexLanguage.scala

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ package mathParser.number
22

33
import mathParser._
44

5-
import NumberBinaryOperator.*
6-
import NumberUnitaryOperator.*
75
import mathParser.number.NumberSyntax.*
6+
import mathParser.number.NumberOperator.*
87

98
object ComplexLanguage {
109
def apply(): ComplexLanguage[Nothing] =

Diff for: math-parser/src/main/scala/mathParser/number/DoubleEvaluate.scala

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package mathParser.number
22

33
import mathParser.Evaluate
4+
import mathParser.number.*
5+
import mathParser.number.NumberOperator.*
46

57
final class DoubleEvaluate[V] extends Evaluate[NumberUnitaryOperator, NumberBinaryOperator, Double, V] {
68

79
import Math._
810

9-
def executeUnitary(uo: NumberUnitaryOperator, a: Double): Double = uo match {
11+
def executeUnitary(uo: NumberUnitaryOperator, a: Double): Double = (uo: Any) match {
1012
case Neg => -a
1113
case Sin => sin(a)
1214
case Cos => cos(a)
@@ -19,14 +21,18 @@ final class DoubleEvaluate[V] extends Evaluate[NumberUnitaryOperator, NumberBina
1921
case Tanh => tanh(a)
2022
case Exp => exp(a)
2123
case Log => log(a)
22-
}
24+
case _ => ???
25+
26+
}
2327

2428
def executeBinaryOperator(bo: NumberBinaryOperator, a: Double, b: Double): Double =
25-
bo match {
29+
(bo: Any) match {
2630
case Plus => a+b
2731
case Minus => a - b
2832
case Times => a * b
2933
case Divided => a / b
3034
case Power => pow(a, b)
35+
case _ => ???
36+
3137
}
3238
}

Diff for: math-parser/src/main/scala/mathParser/number/DoubleLanguage.scala

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mathParser.number
22

33
import mathParser._
44
import mathParser.number.NumberSyntax
5+
import mathParser.number.NumberOperator.*
56

67
object DoubleLanguage {
78
def apply(): Language[NumberUnitaryOperator, NumberBinaryOperator, Double, Nothing] =

Diff for: math-parser/src/main/scala/mathParser/number/NumberDerive.scala

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mathParser.number
22

33
import mathParser.{AbstractSyntaxTree, Derive}
44
import mathParser.AbstractSyntaxTree.*
5+
import mathParser.number.NumberOperator.*
56
import mathParser.number.NumberUnitaryOperator
67
import mathParser.number.NumberBinaryOperator
78
import mathParser.number.NumberSyntax.*
@@ -15,7 +16,7 @@ class NumberDerive[S: Number, V] extends Derive[NumberUnitaryOperator, NumberBin
1516
case VariableNode(`variable`) => one
1617
case VariableNode(_) | ConstantNode(_) => zero
1718
case UnitaryNode(op, f) =>
18-
op match {
19+
(op: Any) match {
1920
case Neg => neg(derive(f))
2021
case Sin => derive(f) * cos(f)
2122
case Cos => neg(derive(f) * sin(f))
@@ -28,14 +29,16 @@ class NumberDerive[S: Number, V] extends Derive[NumberUnitaryOperator, NumberBin
2829
case Tanh => derive(f) / (cosh(f) * cosh(f))
2930
case Exp => exp(f) * derive(f)
3031
case Log => derive(f) / f
32+
case _ => ???
3133
}
3234
case BinaryNode(op, f, g) =>
33-
op match {
35+
(op: Any) match {
3436
case Plus => derive(f) + derive(g)
3537
case Minus => derive(f) - derive(g)
3638
case Times => (derive(f) * g) + (derive(g) * f)
3739
case Divided => ((f * derive(g)) - (g * derive(f))) / (g * g)
3840
case Power => (f ^ (g - one)) * ((g * derive(f)) + (f * log(f) * derive(g)))
41+
case _ => ???
3942
}
4043
}
4144

Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
package mathParser.number
22

3-
enum NumberUnitaryOperator(val name: String):
4-
case Neg extends NumberUnitaryOperator("-")
5-
case Sin extends NumberUnitaryOperator("sin")
6-
case Cos extends NumberUnitaryOperator("cos")
7-
case Tan extends NumberUnitaryOperator("tan")
8-
case Asin extends NumberUnitaryOperator("asin")
9-
case Acos extends NumberUnitaryOperator("acos")
10-
case Atan extends NumberUnitaryOperator("atan")
11-
case Sinh extends NumberUnitaryOperator("sinh")
12-
case Cosh extends NumberUnitaryOperator("cosh")
13-
case Tanh extends NumberUnitaryOperator("tanh")
14-
case Exp extends NumberUnitaryOperator("exp")
15-
case Log extends NumberUnitaryOperator("log")
3+
import mathParser.BinaryOperator
4+
import mathParser.UnitaryOperator
165

17-
enum NumberBinaryOperator(val name: String):
18-
case Plus extends NumberBinaryOperator("+")
19-
case Minus extends NumberBinaryOperator("-")
20-
case Times extends NumberBinaryOperator("*")
21-
case Divided extends NumberBinaryOperator("/")
22-
case Power extends NumberBinaryOperator("^")
6+
enum NumberOperator(val name: String):
7+
case Neg extends NumberOperator("-") with UnitaryOperator
8+
case Sin extends NumberOperator("sin") with UnitaryOperator
9+
case Cos extends NumberOperator("cos") with UnitaryOperator
10+
case Tan extends NumberOperator("tan") with UnitaryOperator
11+
case Asin extends NumberOperator("asin") with UnitaryOperator
12+
case Acos extends NumberOperator("acos") with UnitaryOperator
13+
case Atan extends NumberOperator("atan") with UnitaryOperator
14+
case Sinh extends NumberOperator("sinh") with UnitaryOperator
15+
case Cosh extends NumberOperator("cosh") with UnitaryOperator
16+
case Tanh extends NumberOperator("tanh") with UnitaryOperator
17+
case Exp extends NumberOperator("exp") with UnitaryOperator
18+
case Log extends NumberOperator("log") with UnitaryOperator
19+
case Plus extends NumberOperator("+") with BinaryOperator
20+
case Minus extends NumberOperator("-") with BinaryOperator
21+
case Times extends NumberOperator("*") with BinaryOperator
22+
case Divided extends NumberOperator("/") with BinaryOperator
23+
case Power extends NumberOperator("^") with BinaryOperator
2324

24-
export NumberBinaryOperator.*
25-
export NumberUnitaryOperator.*
25+
26+
type NumberBinaryOperator = NumberOperator & BinaryOperator
27+
type NumberUnitaryOperator = NumberOperator & UnitaryOperator

Diff for: math-parser/src/main/scala/mathParser/number/NumberOptimizer.scala

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import mathParser.AbstractSyntaxTree.*
55
import mathParser.number.*
66
import mathParser.number.NumberSyntax.*
77
import mathParser.OptimizationRule
8+
import mathParser.number.NumberOperator.*
89

910
class NumberOptimizer[S : Number, V](using evaluate: mathParser.Evaluate[NumberUnitaryOperator, NumberBinaryOperator, S, V])
1011
extends mathParser.Optimizer[NumberUnitaryOperator, NumberBinaryOperator, S, V] {

Diff for: math-parser/src/main/scala/mathParser/number/NumberSyntax.scala

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package mathParser.number
33
import mathParser.AbstractSyntaxTree
44
import mathParser.AbstractSyntaxTree.*
55
import mathParser.number.ComplexLanguage
6+
import mathParser.number.NumberOperator.*
67
import mathParser.number.NumberBinaryOperator
78
import mathParser.number.NumberUnitaryOperator
89

0 commit comments

Comments
 (0)