fork(1) download
  1. object SymbolicExpressions {
  2. type Context = Map[Variable, Float]
  3.  
  4. trait Expression {
  5. def result(context: Context): Float
  6. }
  7.  
  8. class Variable extends Expression {
  9. def result(context: Context) = context(this)
  10. }
  11.  
  12. class Constant(value: Float) extends Expression {
  13. def result(context: Context) = value
  14. }
  15.  
  16. trait Operator extends Expression {
  17. protected def a: Expression
  18. protected def b: Expression
  19.  
  20. protected def result(a: Float, b: Float): Float
  21.  
  22. def result(context: Context) = result(a.result(context), b.result(context))
  23. }
  24.  
  25. class Plus(protected val a: Expression, protected val b: Expression) extends Operator {
  26. protected def result(a: Float, b: Float): Float = a + b
  27. }
  28.  
  29. class Minus(protected val a: Expression, protected val b: Expression) extends Operator {
  30. protected def result(a: Float, b: Float): Float = a - b
  31. }
  32.  
  33. class Multiply(protected val a: Expression, protected val b: Expression) extends Operator {
  34. protected def result(a: Float, b: Float): Float = a * b
  35. }
  36.  
  37. class Divide(protected val a: Expression, protected val b: Expression) extends Operator {
  38. protected def result(a: Float, b: Float): Float = a / b
  39. }
  40. }
  41.  
  42. object Main extends App {
  43. import SymbolicExpressions._
  44.  
  45. class Sqrt(x: Expression) extends Expression {
  46. def result(context: Context) = math.sqrt(x.result(context)).toFloat
  47. }
  48.  
  49. val a = new Variable
  50. val b = new Variable
  51. val c = new Variable
  52. val d = new Variable
  53.  
  54. val expression = new Plus(new Minus(new Multiply(new Divide(a, b), c), d), new Sqrt(new Constant(25f)))
  55.  
  56. val context = Map(a -> 1f, b -> 2f, c -> 3f, d -> 4f)
  57. println(expression.result(context))
  58. }
Success #stdin #stdout 0.38s 322432KB
stdin
Standard input is empty
stdout
2.5