// CS 251 decomposition examples abstract class Expr { def toString(): String def eval(x: Double, y: Double): Double } class VarX extends Expr { override def toString(): String = "x" override def eval(x: Double, y:Double): Double = x } class VarY extends Expr { override def toString(): String = "y" override def eval(x: Double, y:Double): Double = y } class Sine(val e: Expr) extends Expr { override def toString(): String = "sin(pi * " + e.toString + ")" override def eval(x: Double, y:Double): Double = Math.sin(Math.PI * e.eval(x,y)) } class Cosine(val e: Expr) extends Expr { override def toString(): String = "cos(pi * " + e.toString + ")" override def eval(x: Double, y:Double): Double = Math.cos(Math.PI * e.eval(x,y)) } class Average(val e1: Expr, val e2: Expr) extends Expr { override def toString(): String = "((" + e1.toString + " + " + e2.toString + ")/2.0)" override def eval(x: Double, y:Double): Double = (e1.eval(x,y) + e2.eval(x,y)) / 2.0 } class Times(val e1: Expr, val e2: Expr) extends Expr { override def toString(): String = "(" + e1.toString + " * " + e2.toString + ")" override def eval(x: Double, y:Double): Double = e1.eval(x,y) * e2.eval(x,y) } val sampleExpr = new Cosine(new Sine(new Times(new Cosine(new Average(new Cosine( new VarX),new Times(new Cosine (new Cosine (new Average (new Times (new VarY,new VarY),new Cosine (new VarX)))), new Cosine (new Times (new Sine (new Cosine (new VarY)),new Average (new Sine (new VarX), new Times (new VarX,new VarX))))))),new VarY)))