View difference between Paste ID: U39Z5UKG and Lt07zBJP
SHOW: | | - or go back to the newest paste.
1
object Book extends App {
2
  abstract class Expr { def eval: Double }
3
  
4-
  class Op(name: String, op: (Double, Double) => (Double)) extends Expr {
4+
  type op = (Double, Double) => (Double)
5-
    var left: Expr = null
5+
  
6-
    var right: Expr = null
6+
  class Op(name: String, op: op, var left: Expr = null, var right: Expr = null) extends Expr {
7
    def apply(_left:Expr , _right: Expr) = {left = _left; right = _right; this}
8
    def eval = op(left.eval, right.eval)
9
    override def toString = "%s(%s, %s)".format(name, left, right)
10
  }
11
12-
  case class Value(eval:Double) extends Expr {
12+
  case class Value(eval:Double) extends Expr { override def toString = eval.toString }
13-
    override def toString = eval.toString
13+
14
  implicit def MakeValue(d: Double) = new Value(d)
15
16
  def MakeOperator(name: String, op: op): Op = new Op(name, op)
17
18-
  def MakeOperator(name: String, op: (Double, Double) => (Double)): Op = new Op(name, op)
18+
19
  def sum = MakeOperator("sum", _+_ )
20
  def div = MakeOperator("div", _/_)
21
22
  def test(x: Expr) { println(x + " = " + x.eval) }
23
24
  test(prod(sum(sum(2, 3), 1), 5))
25
  test(div(sum(28, 2), prod(5, 2)))
26
}